我在工作中使用挂架,但我是django的新手。我正在制作一个rss过滤应用程序,因此我希望有两个按计划运行的后端进程:一个用于为每个用户抓取RSS源,另一个用于确定各个帖子相对于用户过去的首选项的相关性。在pylons中,我只是编写paster命令来使用该数据更新db。 django中有相同的东西吗? EG有没有办法在非交互模式下运行等效的python manage.py shell
?
答案 0 :(得分:2)
我认为这就是Custom Management Commands的目的。
答案 1 :(得分: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()
答案 2 :(得分:0)
听起来你生活中需要一些twod.wsgi:http://packages.python.org/twod.wsgi/