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

时间:2017-10-01 15:29:46

标签: python django django-models mod-wsgi django-commands

我已经搜索了文档并正在寻找一个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_CHECKSsee here),但这似乎使输出静音而不是运行检查花时间。这样的动物存在吗?我正在制作mod_wsgi。我已经看过requires_system_checks个别命令,但我正在寻找一个项目范围的解决方案。非常感谢。

2 个答案:

答案 0 :(得分:1)

您可以创建一个DISABLE_CHECKS设置,并从检查功能本身内强制跳过检查。我注意到,即使您在SILENCED_SYSTEM_CHECKS中设置了settings.py,某些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

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

答案 1 :(得分:0)

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

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秒,而不是三个小时。