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

Django 500 error for not-existing url in Debug=False

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

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

如果我在 DEBUG = True 时导航到 /ad,我会看到正常的 Django 404 错误页面:

但是如果我创建 DEBUG = False 然后服务器向我显示 500.htm 而不是 404.html 用于无效 URL /ad(匹配 URL 模式的 none)。

404.html 显示有效 URL,引发 404 错误。 (比如当 不存在的对象 查询发生在 get_object_or_404 函数时)

这是我的 /templates 目录结构:

/templates
    400.html
    403.html
    404.html
    500.html
    index.html
    ...

那么,如果请求 URL 匹配 URL 模式的 none,我应该如何告诉 Django 在生产(除了开发)中显示 404 错误?

注:

更新:

我发现它很高兴,因为 defaults.page_not_found 引发了 Resolver404,这是由 :

引起的

the path passed to resolve() doesn’t map to a view

这正是发生的事情,(/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)

您需要制作一个 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

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

所以我修复了那个上下文处理器,问题就解决了!