Django自定义命令和cron
-
05-07-2019 - |
题
我希望我的自定义Django命令每分钟执行一次。但是,在 python manage.py mycommand
目录下, python /path/to/project/myapp/manage.py mycommand
似乎无法正常工作。
我怎样才能做到这一点?我使用 / etc / crontab
:
****** root python /path/to/project/myapp/manage.py mycommand
解决方案
我认为问题是cron将以“裸”的方式运行你的脚本。环境,所以您的DJANGO_SETTINGS_MODULE可能未定义。您可能希望将其包装在首先定义DJANGO_SETTINGS_MODULE
的shell脚本中这样的事情:
#!/bin/bash
export DJANGO_SETTINGS_MODULE=myproject.settings
./manage.py mycommand
使其可执行(chmod + x),然后设置cron来代替运行脚本。
修改强>
我还想说你可以“模块化”这个概念有点让你的脚本接受管理命令作为参数。
#!/bin/bash
export DJANGO_SETTINGS_MODULE=myproject.settings
./manage.py ${*}
现在,您的cron作业可以简单地传递“mycommand”。或者您想要从cron作业运行的任何其他manage.py命令。
其他提示
cd /path/to/project/myapp && python manage.py mycommand
通过链接这样的命令,除非cd正确更改目录,否则不会执行python。
如果您希望Django的生活更简单,请在项目中使用django-command-extensions:
http://code.google.com/p/django-command-extensions /
你会找到一个名为“runscript”的命令。所以你只需将命令添加到crontab行:
****** root python /path/to/project/myapp/manage.py runscript mycommand
这样的脚本将使用Django上下文环境执行。
这是我最近在我的一个项目中所做的事情(我维护我工作的每个项目的venvs,所以我假设你有venvs)
***** /path/to/venvs/bin/python /path/to/app/manage.py command_name
这对我很有用。
没有详细记录脚本扩展名。与django命令不同,这个命令可以在项目中的任何位置运行,并且需要脚本文件夹。 .py文件需要run()函数。
-
如果是独立脚本,则需要执行此操作:
from django.conf import settings from django.core.management import setup_environ setup_environ(settings) #your code here which uses django code, like django model
-
如果是django命令,则更容易: https://coderwall.com/p/k5p6ag
在(management / commands / exporter.py)
中from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): args = '' help = 'Export data to remote server' def handle(self, *args, **options): # do something here
醇>
然后,在命令行中:
$ python manage.py exporter
现在,使用crontab将新的cron任务添加到Linux系统很容易:
$ crontab -e
or $ sudo crontab -e if you need root privileges
在crontab文件中,例如每15分钟运行一次此命令,如下所示:
# m h dom mon dow command
*/15 * * * * python /var/www/myapp/manage.py exporter