Django相当于后端进程的paster

发布于 2024-08-30 17:17:08 字数 230 浏览 11 评论 0原文

我在工作中使用 pylons,但我是 django 的新手。我正在制作一个 RSS 过滤应用程序,因此我希望有两个按计划运行的后端进程:一个用于抓取每个用户的 RSS 提要,另一个用于确定各个帖子相对于用户过去偏好的相关性。在 pylons 中,我只需编写粘贴命令来使用该数据更新数据库。 django 中有类似的东西吗? EG 有没有办法在非交互模式下运行相当于 python manage.py shell 的东西?

I use pylons in my job, but I'm new to django. I'm making an rss filtering application, and so I'd like to have two backend processes that run on a schedule: one to crawl rss feeds for each user, and another to determine relevance of individual posts relative to users' past preferences. In pylons, I'd just write paster commands to update the db with that data. Is there an equivalent in django? EG is there a way to run the equivalent of python manage.py shell in a non-interactive mode?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

浪漫之都 2024-09-06 17:17:08

我认为这就是自定义管理命令的用途。

I think that's what Custom Management Commands are there for.

洒一地阳光 2024-09-06 17:17:08

是的,这实际上就是我运行 cron 备份脚本的方式。如果您使用虚拟环境和项目设置,则只需加载 virtualenv 即可。

我希望你能遵循这一点,但是在 # manage.py shell 行之后,你可以编写代码,就像在 manage.py shell 中一样

你可以导入你的 virtualenv然后,

import site

site.addsitedir(VIRTUALENV_PATH + '/lib/python2.6/site-packages')

您可以将 django 项目添加到路径中

import sys

sys.path.append(DJANGO_ROOT)
sys.path.append(PROJECT_PATH)

接下来,将 django 设置和 chdir 加载到 django 项目

import os

from django.core.management import setup_environ
from myproject import settings
setup_environ(settings)

os.chdir(PROJECT_PATH)

中 之后,您的环境将被设置,就像您从 manage.py shell 开始一样

然后您可以运行任何内容,就像在交互式 shell 中一样。

from application.models import MyModel

for element in MyModel:
    element.delete()

这是我的完整备份文件。我已将流程抽象为函数。这将被命名为 daily_backup 并放入 cron.daily 文件夹中以每天运行。您可以了解如何设置环境并根据需要修改功能。

#!/usr/bin/env python
import sys
import os
import site
import logging

from datetime import datetime

PROJECT_NAME = 'myproject'
DJANGO_ROOT = '/var/www/django'
PROJECT_PATH = DJANGO_ROOT + '/' + PROJECT_NAME
VIRTUALENV_PATH = '/var/www/envs/'+ PROJECT_NAME
BACKUP_DIR = '/var/www/backups/%s/daily' % (PROJECT_NAME)
TODAY = datetime.now().strftime('%Y%m%d-%H%M%S')
FILE_NAME = PROJECT_NAME + '_' + TODAY

site.addsitedir(VIRTUALENV_PATH + '/lib/python2.6/site-packages')
sys.path.append(DJANGO_ROOT)
sys.path.append(PROJECT_PATH)

from django.core.management import setup_environ
from myproject import settings
setup_environ(settings)

os.chdir(PROJECT_PATH)

# manage.py shell
from django.conf import settings

logging.basicConfig(level=logging.WARN)

def _setup():
    if not os.path.exists(BACKUP_DIR):
        logging.debug('Creating backup directory ' + BACKUP_DIR)
        os.mkdir(BACKUP_DIR)
        os.mkdir(BACKUP_DIR + '/databases')
    else:
        logging.debug('Using backup directory ' + BACKUP_DIR)

def _remove_old():
    logging.debug('Cleaning out old backups')
    # keep past 7 days
    command = "find %s* -name '%s*' -mtime +7 -exec rm {} \\;" % (BACKUP_DIR, PROJECT_NAME)
    os.system(command)

def _create_backup():
    logging.debug('Backup database')

    if settings.DATABASE_ENGINE == 'mysql':
        command = 'mysqldump -u %s --password=%s %s > %s/databases/%s.sql' % (settings.DATABASE_USER, settings.DATABASE_PASSWORD, settings.DATABASE_NAME, BACKUP_DIR, FILE_NAME)
    else:
        command = '%s/bin/python %s/manage.py dumpdata --indent=4 > %s/databases/%s.json' % (VIRTUALENV_PATH, PROJECT_PATH, BACKUP_DIR, FILE_NAME)

    os.system(command)

    logging.debug('Backup project')
    command = 'tar -czf %s/%s.tgz -C %s %s/' % (BACKUP_DIR, FILE_NAME, DJANGO_ROOT, PROJECT_NAME)
    os.system(command)


if __name__ == '__main__':
    _setup()
    _remove_old()
    _create_backup()

Yes, this is actually how I run my cron backup scripts. You just need to load your virtualenv if you're using virtual environments and your project settings.

I hope you can follow this, but after the line # manage.py shell you can write your code just as if you were in manage.py shell

You can import your virtualenv like so:

import site

site.addsitedir(VIRTUALENV_PATH + '/lib/python2.6/site-packages')

You can then add the django project to the path

import sys

sys.path.append(DJANGO_ROOT)
sys.path.append(PROJECT_PATH)

Next you load the django settings and chdir to the django project

import os

from django.core.management import setup_environ
from myproject import settings
setup_environ(settings)

os.chdir(PROJECT_PATH)

After this point your environment will be set just like if you started with manage.py shell

You can then run anything just as if you were in the interactive shell.

from application.models import MyModel

for element in MyModel:
    element.delete()

Here is my backup file in full. I've abstracted the process out into functions. This would be named daily_backup and be put into the cron.daily folder to be run daily. You can see how to set up the environment and modify the functionality as needed.

#!/usr/bin/env python
import sys
import os
import site
import logging

from datetime import datetime

PROJECT_NAME = 'myproject'
DJANGO_ROOT = '/var/www/django'
PROJECT_PATH = DJANGO_ROOT + '/' + PROJECT_NAME
VIRTUALENV_PATH = '/var/www/envs/'+ PROJECT_NAME
BACKUP_DIR = '/var/www/backups/%s/daily' % (PROJECT_NAME)
TODAY = datetime.now().strftime('%Y%m%d-%H%M%S')
FILE_NAME = PROJECT_NAME + '_' + TODAY

site.addsitedir(VIRTUALENV_PATH + '/lib/python2.6/site-packages')
sys.path.append(DJANGO_ROOT)
sys.path.append(PROJECT_PATH)

from django.core.management import setup_environ
from myproject import settings
setup_environ(settings)

os.chdir(PROJECT_PATH)

# manage.py shell
from django.conf import settings

logging.basicConfig(level=logging.WARN)

def _setup():
    if not os.path.exists(BACKUP_DIR):
        logging.debug('Creating backup directory ' + BACKUP_DIR)
        os.mkdir(BACKUP_DIR)
        os.mkdir(BACKUP_DIR + '/databases')
    else:
        logging.debug('Using backup directory ' + BACKUP_DIR)

def _remove_old():
    logging.debug('Cleaning out old backups')
    # keep past 7 days
    command = "find %s* -name '%s*' -mtime +7 -exec rm {} \\;" % (BACKUP_DIR, PROJECT_NAME)
    os.system(command)

def _create_backup():
    logging.debug('Backup database')

    if settings.DATABASE_ENGINE == 'mysql':
        command = 'mysqldump -u %s --password=%s %s > %s/databases/%s.sql' % (settings.DATABASE_USER, settings.DATABASE_PASSWORD, settings.DATABASE_NAME, BACKUP_DIR, FILE_NAME)
    else:
        command = '%s/bin/python %s/manage.py dumpdata --indent=4 > %s/databases/%s.json' % (VIRTUALENV_PATH, PROJECT_PATH, BACKUP_DIR, FILE_NAME)

    os.system(command)

    logging.debug('Backup project')
    command = 'tar -czf %s/%s.tgz -C %s %s/' % (BACKUP_DIR, FILE_NAME, DJANGO_ROOT, PROJECT_NAME)
    os.system(command)


if __name__ == '__main__':
    _setup()
    _remove_old()
    _create_backup()
赠意 2024-09-06 17:17:08

听起来你的生活中需要一些twod.wsgi:http://packages.python.org/twod。 WSGI/

Sounds like you need some twod.wsgi in your life: http://packages.python.org/twod.wsgi/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文