5

使用中间件,我可以在每个 HTTP 请求的开头和结尾执行代码。

对于 Celery 任务,我可以使用task_prerunandtask_postrun信号来完成相同的任务。

django 管理命令呢?是否可以在每个 django 管理命令的开头(也可能是结尾)运行代码?这样的代码还必须知道哪个 django 管理命令即将运行(或已经运行完毕)。有一张关于应用程序启动信号的票,它可能会或可能不会做我想要的,但无论如何它还没有准备好。

4

2 回答 2

2

正如您正确指出的那样,Django 中没有特定位置可以放置每次启动时执行的代码...

有些地方你可能会为此“滥用”,例如。inurls.py或 in 中的代码models.py应该在启动时运行...(例如,管理员将这种情况用于其admin.autodiscover()in urls.py)。

还有一些可能性可以查明代码是否由于执行了管理命令而运行;如果命令行参数sys.argv包含任何管理命令,您可以清楚地检查它们。另一种可能性是通过服务器/管理命令指定不同的设置来运行应用程序....

于 2012-12-11T16:05:15.253 回答
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
于 2016-11-18T07:40:56.947 回答