【发布时间】:2010-12-20 07:15:42
【问题描述】:
我想在我的 django 进程启动时运行一些环境检查,并在出现错误的情况下嘈杂地死掉。我在想诸如数据库的编码不正确或者机器有我们不支持的 python 版本。
我宁愿我们的团队面对一个他们必须修复的致命错误,而不是能够忽略它。
我可以写这些支票,但我很好奇把它们放在哪里最好。如何让它们作为 django 启动过程的一部分执行?我认为可能有一个信号我也可以听到,但我在文档中找不到相关的信号。
【问题讨论】:
我想在我的 django 进程启动时运行一些环境检查,并在出现错误的情况下嘈杂地死掉。我在想诸如数据库的编码不正确或者机器有我们不支持的 python 版本。
我宁愿我们的团队面对一个他们必须修复的致命错误,而不是能够忽略它。
我可以写这些支票,但我很好奇把它们放在哪里最好。如何让它们作为 django 启动过程的一部分执行?我认为可能有一个信号我也可以听到,但我在文档中找不到相关的信号。
【问题讨论】:
这里的大多数答案都非常古老,所以我认为这就是为什么没有提到 Django's checks framework。
至少从 v2(撰写本文时 django==3.1)开始,它就已成为 django 的一部分。
这可能是您进行大多数检查的正确位置。
我仍然会考虑使用 settings,正如其他答案所述,检查需要 settings 内容但也需要在准备应用程序之前运行。
【讨论】:
我已经测试了所有三个 __init__.py Settings.py 和 urls.py 方法,这就是我发现的。
当代码从 __init__.py 或 Settings.py 运行时,启动函数在 Web 服务器启动时运行 两次;当启动函数从 urls.py 运行时,代码运行一次,但是它仅在向我们的服务器发出第一个请求时运行,导致第一个用户访问可能需要长时间等待您的网站。
在将大型 Web 应用程序重新联机时调用“预热”页面是标准做法,因此我认为从 urls.py 中明确标识的位置调用启动函数应该不是问题。
【讨论】:
你可以像其他人提到的那样把它放在settings.py中,但是在设置中有代码并不理想。还可以选择为 django.db.models.signals.class_prepared 添加一个处理程序,在准备好特定模型类后执行所需的启动检查。
【讨论】:
我们为此使用顶级urls.py。
【讨论】:
如果你想检查系统是否正确安装,我认为你应该写你的own admin command并运行它作为安装后检查。
我认为不值得经常检查是否正确安装了 python 版本,尤其是当您在共享主机上安装 django 应用程序时。我的应用程序托管在 alwaysdata 上,他们每小时都会重新启动 FastCgi 进程。这些检查可能会影响应用程序的响应时间。
【讨论】:
如果您不想使用设置模块,请尝试项目的__init__.py。
【讨论】:
我会将它们放在 settings.py 中。过去,我进行了这样的系统检查:
try:
from local_settings import *
except ImportError:
print "Missing %s" % os.path.join(PROJECT_ROOT, "local_settings.py")
if DEBUG:
for p in [PROJECT_ROOT, MEDIA_ROOT, THEME_DIR, ADMIN_MEDIA_ROOT] + list(TEMPLATE_DIRS):
p = os.path.normpath(p)
if not os.path.exists(p):
print "Missing path: %s" % p
【讨论】:
settings.py 也是我的选择,用于此安全检查。我认为有一个模型验证后信号(一种由管理命令可选地完成的模型验证),但我在源代码中找不到。