在任何django管理命令之前运行代码

在任何django管理命令之前运行代码,django,Django,使用中间件,我可以在每个HTTP请求的开头和结尾执行代码 对于芹菜任务,我可以通过使用task\u prerun和task\u postrun信号来完成相同的任务 django管理命令呢?是否可以在每个django管理命令的开头(可能是结尾)运行代码?这类代码还必须知道哪个django管理命令即将运行(或已完成运行)。有一张关于a的罚单,它可能做我想做的事,也可能不做我想做的事,但它还没有准备好。正如您正确地指出的,Django中没有特定的地方可以放置每次启动时执行的代码 有些地方您可能会出于此

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

对于芹菜任务,我可以通过使用
task\u prerun
task\u postrun
信号来完成相同的任务


django管理命令呢?是否可以在每个django管理命令的开头(可能是结尾)运行代码?这类代码还必须知道哪个django管理命令即将运行(或已完成运行)。有一张关于a的罚单,它可能做我想做的事,也可能不做我想做的事,但它还没有准备好。

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

有些地方您可能会出于此目的而“误用”,例如
url.py中的代码或
models.py中的代码应在启动时运行…(例如,管理员将此情况用于
admin.autodiscover()
中的
url.py


还有一些可能查明代码是否由于执行管理命令而运行;如果命令行参数包含任何管理命令,则可以通过检查命令行参数。另一种可能是通过服务器/管理命令为运行应用程序指定不同的设置…

如果需要在管理命令之前/之后添加的代码不需要访问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\u management\u command
可以访问django模型

这只是一个基本的例子,实际上你需要确保
sys.argv
至少有两个条目,并且第二个条目不以
-
开头,以防止像这样的误报调用

 ./manage.py
 ./manage.py -h
 ./manage.py --help

这也是我的想法。另一种不完全干净的方法是使用MonkeyPatch django.core.management.base.py,特别是
BaseCommand.execute()
,并在其周围放置一个包装器。如果您喜欢MonkeyPatch,请确保。。。首先,你想实现什么目标?首先,我希望我的猴子在玩魔兽世界时不要摔坏我也有这样的想法:你把启动代码放在,比如说,
startup.py
,然后在
settings.py
中导入启动。我测试了它,它似乎工作。在某些情况下,它可能更干净(例如,您可以在不更改应用程序代码的情况下向现有Django应用程序添加一些与系统管理相关的内容)。