Django:禁用生产中的初始系统检查?

Django: disable initial system checks in production?

我已经搜索了文档并正在寻找一个在生产中禁用系统检查(不仅仅是使它们静音)的 Django 设置。我有一个包含 20,000 多个模型的项目,这些模型是自动生成的以创建 RESTful 个端点。这些系统检查需要相当长的时间:

https://docs.djangoproject.com/en/1.11/ref/checks/#models

在开发中检查系统是必要的,即使它会导致 manage.py 20-30 分钟启动。但是,每当我将新版本发布到生产环境时,对生产节点的第一个 HTTP 请求也需要 20-30 分钟才能响应!我显然想避免这种情况,因为在初始请求之后,该网站快如闪电。

虽然下面评论中的答案引用了使 runserver 更快出现的解决方案,但我正在寻找生产解决方案,而不是我们的开发环境。

我四处寻找类似 DISABLED_SYSTEM_CHECKS 的设置,但只遇到 SILENCED_SYSTEM_CHECKS (),但这似乎只是让输出静音而不是 运行 花时间的检查。这样的动物存在吗?我在生产中 运行 mod_wsgi。我已经看到 requires_system_checks 用于单个命令,但我正在寻找一个项目范围的解决方案。非常感谢。

您可以创建一个 DISABLE_CHECKS 设置并强制跳过检查函数本身的检查。我注意到即使您在 settings.py 中设置 SILENCED_SYSTEM_CHECKS,某些 manage.py 命令仍然会 运行 检查(例如迁移)。这是我使用的:

import logging

from django.conf import settings
from django.core.checks import Error
from django.db import connections
from django.core.cache import caches

def check_cache_connectivity(app_configs, **kwargs):
    """
    Check cache
    :param app_configs:
    :param kwargs:
    :return:
    """
    errors = []

    # Short circuit here, checks still ran by manage.py cmds regardless of SILENCED_SYSTEM_CHECKS
    if settings.DISABLE_CHECKS:
        return errors

    cache_settings = settings.CACHES.keys()
    for cur_cache in cache_settings:
        try:
            key = 'check_cache_connectivity_{}'.format(cur_cache)
            caches[cur_cache].set(key, 'connectivity_ok', 30)
            value = caches[cur_cache].get(key)
            print("Cache '{}' connection ok, key '{}', value '{}'".format(cur_cache, key, value))
        except Exception as e:
            msg = "ERROR: Cache {} looks to be down. {}".format(cur_cache, e)
            print(msg)
            logging.exception(msg)
            errors.append(
                Error(
                    msg,
                    hint="Unable to connect to cache {}, set as {}. {}"
                         "".format(cur_cache, settings.CACHES[cur_cache], e),
                    obj='CACHES.{}'.format(cur_cache),
                    id='content_services.E002',
                )
            )
    return errors

我在我的构建环境中使用它,我希望忽略大部分(如果不是全部)自定义检查。希望对您有所帮助!

我很久以前就发布了这个问题,但从未发布过我最终使用的解决方案。根本问题在于,对于那么多模型(我们现在多达 60,000 个!),每个模型都将在加载时进行验证。 urls.py 包含所有端点路由,这将导入 DRF ViewSets,这反过来又会预先加载序列化程序和模型。所以我所做的是创建一种延迟加载,我们已经将其开源:

https://pypi.org/project/automagic-rest/

关键要素是修改 ViewSet 以在 __init__ 中按需加载模型,而不是预先加载:

self.model = getattr(
    import_module(f"{self.python_path_name}.models.{self.schema_name}"),
    f"{self.schema_name}_{self.table_name}_model",
)

您可以在此处查看完整的源代码:https://github.com/wharton/automagic-rest/blob/master/automagic_rest/views.py#L53

这需要为 DRF basename 制定一个约定来保存数据库名称、应用程序名称、模式名称和模型名称,但它运作良好。 60,000 个模型的初始加载时间现在约为 45 秒,而不是三个多小时。