【问题标题】:Correct place to put extra startup code in django?在 django 中放置额外启动代码的正确位置?
【发布时间】:2010-12-20 07:15:42
【问题描述】:

我想在我的 django 进程启动时运行一些环境检查,并在出现错误的情况下嘈杂地死掉。我在想诸如数据库的编码不正确或者机器有我们不支持的 python 版本。

我宁愿我们的团队面对一个他们必须修复的致命错误,而不是能够忽略它。

我可以写这些支票,但我很好奇把它们放在哪里最好。如何让它们作为 django 启动过程的一部分执行?我认为可能有一个信号我也可以听到,但我在文档中找不到相关的信号。

【问题讨论】:

标签: python django


【解决方案1】:

这里的大多数答案都非常古老,所以我认为这就是为什么没有提到 Django's checks framework

至少从 v2(撰写本文时 django==3.1)开始,它就已成为 django 的一部分。

这可能是您进行大多数检查的正确位置。

我仍然会考虑使用 settings,正如其他答案所述,检查需要 settings 内容但也需要在准备应用程序之前运行。

【讨论】:

    【解决方案2】:

    我已经测试了所有三个 __init__.py Settings.py 和 urls.py 方法,这就是我发现的。

    当代码从 __init__.py 或 Settings.py 运行时,启动函数在 Web 服务器启动时运行 两次;当启动函数从 urls.py 运行时,代码运行一次,但是它仅在向我们的服务器发出第一个请求时运行,导致第一个用户访问可能需要长时间等待您的网站。

    在将大型 Web 应用程序重新联机时调用“预热”页面是标准做法,因此我认为从 urls.py 中明确标识的位置调用启动函数应该不是问题。

    【讨论】:

      【解决方案3】:

      你可以像其他人提到的那样把它放在settings.py中,但是在设置中有代码并不理想。还可以选择为 django.db.models.signals.class_prepared 添加一个处理程序,在准备好特定模型类后执行所需的启动检查。

      【讨论】:

        【解决方案4】:

        我们为此使用顶级urls.py

        【讨论】:

        【解决方案5】:

        如果你想检查系统是否正确安装,我认为你应该写你的own admin command并运行它作为安装后检查。

        我认为不值得经常检查是否正确安装了 python 版本,尤其是当您在共享主机上安装 django 应用程序时。我的应用程序托管在 alwaysdata 上,他们每小时都会重新启动 FastCgi 进程。这些检查可能会影响应用程序的响应时间。

        【讨论】:

          【解决方案6】:

          如果您不想使用设置模块,请尝试项目的__init__.py

          【讨论】:

            【解决方案7】:

            我会将它们放在 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
            

            【讨论】:

            • 我可以看到它可以工作,但是混合可执行代码和配置感觉“错误”。
            • 当然,我会买那个。 PiotrLegnica 对 __init__.py 的建议听起来不错,尽管我怀疑您是否会在 settings.py 加载时完成初始化。
            • settings.py 也是我的选择,用于此安全检查。我认为有一个模型验证后信号(一种由管理命令可选地完成的模型验证),但我在源代码中找不到。
            猜你喜欢
            • 1970-01-01
            • 2019-06-29
            • 2010-10-12
            • 1970-01-01
            • 1970-01-01
            • 2021-06-29
            • 2021-06-14
            • 1970-01-01
            • 2017-07-29
            相关资源
            最近更新 更多