Django 3设置DEBUG=False生产环境报500且根路径访问异常
问题原因与解决方案
1. 根路径访问返回404的原因
你所有的前端业务路由都放在了i18n_patterns中,Django的多语言路由规则要求这部分路由必须带上语言前缀(比如/en/、/bg/)才能匹配,不带前缀的根路径/不在路由匹配范围内,因此触发404错误。
对应解决方案
二选一即可:
- 配置自动重定向:确保
settings.py中MIDDLEWARE列表里已添加django.middleware.locale.LocaleMiddleware,且顺序放在django.middleware.common.CommonMiddleware之后,同时设置USE_I18N = True以及默认语言LANGUAGE_CODE = 'en',访问根路径时会自动跳转到默认语言对应的路径。 - 手动添加根路径路由:在非i18n前缀的
urlpatterns中新增重定向规则:
url(r'^$', RedirectView.as_view(url=f'/{settings.LANGUAGE_CODE}/', permanent=True)),
2. 404模板继承base.html触发500错误的原因
你的base.html中大量使用了Wagtail专属的上下文变量self(比如self.seo_title、self.get_site等),这个变量只有在渲染Wagtail正式页面的时候才会被注入到模板上下文。而Django默认渲染404错误页时,不会携带Wagtail的页面对象上下文,因此模板找不到self变量。
DEBUG=True模式下Django会默认忽略不存在的模板变量,不会报错;但DEBUG=False时,不存在的模板变量会直接抛出异常,最终把原本的404响应变成500错误。你移除继承后404模板没有用到self变量,因此运行正常。
对应解决方案
二选一即可:
- 改造base.html的变量引用:对所有用到
self的地方增加存在性判断,不存在时用默认值兜底:
{% block title %} {% if self %} {% if self.seo_title %} {{ self.seo_title }} {% elif self.translated_title %} {{ self.translated_title }} {% else %} {{ self.title }} {% endif %} {% else %} 你的站点默认名称 {% endif %} {% endblock %} {% block title_suffix %} {% if self %} {% with self.get_site.site_name as site_name %} {% if site_name %}- {{ site_name }}{% endif %} {% endwith %} {% else %} - 你的站点默认名称 {% endif %} {% endblock %}
- 404模板覆盖父模板的相关块:在404.html中直接重写title相关块,避免调用父模板中用到
self的逻辑:
{% extends "base.html" %} {% block title %}页面未找到{% endblock %} {% block title_suffix %} - 你的站点名称{% endblock %} {% block body_class %}template-404{% endblock %} {% block content %} <h1>Page not found</h1> <h2>Sorry, this page could not be found.</h2> {% endblock %}
内容的提问来源于stack exchange,提问作者mgPePe
相关产品推荐
相关产品推荐

