使用中间件,我可以在每个HTTP请求的开头和结尾执行代码。
使用Celery任务,我可以使用task_prerun
和task_postrun
信号完成相同的工作。
django管理命令怎么样?是否有可能在每个django管理命令的开头(可能结束)运行代码?此类代码还必须知道哪个django管理命令即将运行(或已完成运行)。有一张关于signal on application startup的票可能会或可能不会达到我的要求,但它还没有准备好。
答案 0 :(得分:2)
正如你所说的那样,Django中没有特定的地方可以放置每次启动时执行的代码......
有些地方可能会为此目的“滥用”,例如。 urls.py
或models.py
中的代码应在启动时运行...(例如,管理员将此情况用于admin.autodiscover()
中的urls.py
。
还有一些可能性来确定是否由于执行管理命令而运行代码;如果它们包含任何管理命令,您可以通过sys.argv
清楚地检查命令行参数。另一种可能性是通过服务器/管理命令指定运行应用程序的不同设置....
答案 1 :(得分:0)
如果您需要在管理命令之前/之后添加的代码不需要访问django模型/设置,那么您只需更新manage.py
脚本。
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
from django.core.management import execute_from_command_line
from startup import pre_management_command, post_management_command
pre_management_command(sys.argv[1], sys.argv[2:])
execute_from_command_line(sys.argv)
post_management_command(sys.argv[1], sys.argv[2:])
我不是100%肯定,但我认为post_management_command
可以访问django模型。
这只是一个基本示例,实际上,您需要确保sys.argv
至少有两个条目,并且第二个条目不以-
开头,以防止误报等
./manage.py
./manage.py -h
./manage.py --help