django - Debug=False 中不存在的 url 的 Django 500 错误
问题描述
我在 python 3.6.7 中使用 Django 2.1.3。假设我有这个 URL 路径:
path('admin/', admin.site.urls)
如果我导航到/ad
while DEBUG = True
,我会看到正常的 Django 404 错误页面:
但是,如果我这样做DEBUG = False
了,那么服务器会向我显示500.htm而不是404.html用于无效 URL /ad
(不匹配任何 URL 模式)。
404.html显示为引发 404 错误的有效 URL 。(例如当函数发生不存在的对象查询时get_object_or_404
)
这是我的/templates
目录结构:
/templates
400.html
403.html
404.html
500.html
index.html
...
那么,如果请求 URL 与任何 URL 模式都不匹配,我应该如何告诉 Django 在生产中(除了开发)显示 404 错误?
笔记:
- 根据docs,如果我
404.html
在根模板目录中有一个,则此 404.html 将与默认错误处理程序一起使用。
更新:
我发现它已经发生了,因为defaults.page_not_found
引发了 a Resolver404
,这是由以下原因引起的:
传递给 resolve() 的路径没有映射到视图
这正是发生的事情,(/ad
不匹配任何观点)
这是我的 urls.py:
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
解决方案
我发现我的一个自定义模板上下文处理器使用django.urls.resolve
,并且由于路径与任何视图都不匹配,因此resolve
引发了Resolver404。
所以我修复了那个上下文处理器,问题就解决了!
推荐阅读
- windows - 对文件夹中的所有文件运行批处理脚本
- angular - 带有角度日期选择器的自定义值访问器
- makefile - 如何将make参数保存在变量中
- ios - -[UIThreadSafeNode canPerformAction:withSender:]: 无法识别的选择器发送到实例
- python - 如何在python中获取当前选择的音频设备?
- android - 抽屉菜单在点击事件上没有做任何事情
- azure-devops - 值不能为空。参数名称:build.Definition
- ios - iPadOs 13.2 Beta NavigationController 崩溃
- windows - 如何检查会话是否在 Windows 终端服务器中被隐藏
- dat.gui - dat.gui 删除和添加监听器