我已经搜索了文档并正在寻找一个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
个别命令,但我正在寻找一个项目范围的解决方案。非常感谢。
答案 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秒,而不是三个小时。