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 秒,而不是三个多小时。
我已经搜索了文档并正在寻找一个在生产中禁用系统检查(不仅仅是使它们静音)的 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 秒,而不是三个多小时。