Skip to main content
 首页 » 编程设计

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

2025年02月15日25sky-heaven

我已经搜索了文档并正在寻找一个 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 ( see here ),但这似乎只是让输出静音而不是没有运行需要时间的检查。这样的动物存在吗?我在生产环境中运行 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 

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