最近用Django写了一个项目,但是有一个地方需要应用在后台自动定期执行检查,并存入数据库,如果单纯的写Python程序的话不能很好的跟django的结合在一起,写起来也和麻烦,查找资料的时候发现了django有一个功能,就是django command,通过这个就可以使用django的manage.py去执行命令了。
实现思路:
1.首先把需要自动执行的django method写成django command
2.将自己定义的django command添加到cron中使用cron服务实现定期执行
一、在django工程中添加自定义的django command
1.我们自己建立的application叫做myapp,首先在这个app目录下,我们需要新建management目录,这个目录里应该包括:__init__.py(内容为空,用于打包)和commands目录,然后在commands目录下包括:__init__.py和mycommand.py ,其中 mycommand.py就是用于我们自定义command的方法,目录的树状结构如下:
myapp/ __init__.py models.py management/ __init__.py commands/ __init__.py mycommand.py tests.py views.py
2.mycommand.py的command内容书写,简单示例如下:
from django.core.management.base import BaseCommand,commandError class Command(BaseCommand): def handle(self, *args, **options): print "hello world"
我们把BaseCommand类关联进来,使用command类和handle方法来作为框架,如上,这个command实现的就是输出 "hello world"。
通过以上 我们就可以使用python manage.py mycommand 的方式来运行我们自己的django命令了。
想了解更详细,请参考资料3。
二、使用cron来定期执行django command
cron的用法在这里不作详细介绍,具体怎么添加修改cron,自行查阅相关资料。不过添加cron命令有很多种实现方法,现整理如下:
1、最简单的一种,直接在crontab添加如下命令:
*/5 * * * * root cd /home/www/myproject/myapp && python manage.py mycommand
在这里直接执行python /home/www/myproject/manage.py mycommand是不行的,具体为什么还请大神指点。
2、可以写一个shell脚本,然后执行,给大家参考:
#!bin/bash p=$PWD touch $p/djangocron touch $p/djangocron.log echo "0 6,12,18 * * 1-5 python $p/manage.py mycommand > $p/djangocron.log 2>&1" > djangocron crontab djangocron crontab -l
解释一下:
这个脚本放在与manage.py同一目录下,以便p=$PWD获取能用的当前路径。
touch先建立一个djangocron文件,用于存放crontab的命令,建立的djangocron.log用来存输出信息。
3、
4、