1

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

4

3 回答 3

2

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

于 2010-05-03T07:19:43.350 回答
1

是的,这实际上是我运行我的 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()
于 2010-05-02T20:06:48.063 回答
0

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

于 2011-01-14T15:04:51.527 回答