Debug = False 中不存在的 url 的 Django 500 错误

Posted

技术标签:

【中文标题】Debug = False 中不存在的 url 的 Django 500 错误【英文标题】:Django 500 error for not-existing url in Debug=False 【发布时间】:2019-06-01 09:34:34 【问题描述】:

我在 python 3.6.7 中使用 Django 2.1.3。 假设我有这个 URL 路径:

path('admin/', admin.site.urls)

如果我导航到/adDEBUG = 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 引发了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)

【问题讨论】:

【参考方案1】:

我发现我的一个自定义模板上下文处理器使用django.urls.resolve,并且由于路径不匹配任何视图,resolve 引发 Resolver404

所以我修复了上下文处理器并解决了问题!

【讨论】:

【参考方案2】:

您需要创建一个 404 视图,该视图将在没有 URL 匹配时呈现。然后你需要在urls.py中设置hander404

handler404 = 'mysite.views.my_custom_page_not_found_view'

欲了解更多信息:https://docs.djangoproject.com/en/dev/topics/http/views/#customizing-error-views

【讨论】:

我只需要更改错误页面模板,但我这样做并得到相同的结果,如果 URL 不匹配任何 URL 模式,则会显示 500 错误页面! 添加你的 urls.py 需要在urls.py中添加handler404

以上是关于Debug = False 中不存在的 url 的 Django 500 错误的主要内容,如果未能解决你的问题,请参考以下文章

如果表中不存在记录如何返回false

C#编程中,当前上下文中不存在名称"Debug"是啥意思?

当前上下文中不存在名称“trace”

Apache Django 静态文件不提供 DEBUG=False [重复]

为啥 DEBUG=False 设置使我的 django 静态文件访问失败?

Django 在 debug = False 时找不到我的媒体文件夹