Django 3.x - 自定义错误页面显示 500 而它应该是 404
Django 3.x - Custom Error Page is showing a 500 when it should be a 404
更新:添加了我正在访问的引发错误的代码
对于我正在使用 wiki 页面的 CS50 项目,当用户键入 wiki/TITLE 中不存在的页面时,我尝试发送正确的自定义 404 错误,但是当我输入缺失的页面,Django 会抛出 500 而不是 404。这是常见错误还是我的错误消息有误?调试设置为 False,允许的主机在设置中配置为 ['*']:
这是我在 views.py 中的自定义错误处理程序:
def error_404(request, exception):
context = {}
response = render(request, 'encyclopedia/error_404.html', context=context)
response.status_code = 404
return response
def error_500(request):
context = {}
response = render(request, 'encyclopedia/error_500.html', context=context)
response.status_code = 500
return response
这是他们在 wiki/urls.py:
中的样子
from django.contrib import admin
from django.urls import include, path
from django.conf.urls import handler404, handler500
urlpatterns = [
path('admin/', admin.site.urls),
path('', include("encyclopedia.urls")),
]
handler404 = "encyclopedia.views.error_404"
handler500 = "encyclopedia.views.error_500"
这里是 views.py 中的函数,我正在访问但要转到 wiki/C:
#function gets entry from index.html's <li>
def entry_page(request, entry):
name = entry # Places the title
print(f"checking the title: {entry}")
text = util.get_entry(entry) # Grabs the entry using the util function
html = md_converter(text)
if text is not None:
return render(request, "encyclopedia/entry.html", {
"title": name,
"entry": html
})
这是我的 urls.py 很好的衡量标准:
from django.urls import path
from . import views
app_name = "encyclopedia"
urlpatterns = [
path("", views.index, name="index"),
path("wiki/<str:entry>", views.entry_page, name="entry"),
path("wiki/edit/<str:title>", views.edit, name="edit"),
path("search", views.search, name="search"),
path("random", views.random_page, name="random"),
path("create_entry",views.create_entry, name="create_entry")
]
这是终端显示的内容(我的 styles.css 出于某种原因抛出 404,但我没有更改那里的任何内容...这是一个单独的问题):
您的代码可能有问题。 Django 文档清楚地说
The 404 view is also called if Django doesn’t find a match after checking every regular expression in the URLconf.
https://docs.djangoproject.com/en/3.2/ref/views/#error-views
想通了。谢谢你们。
我用来抓取页面的函数出错了。我在查找特定 wiki 条目时并没有检查 URL 是否有效。
将 views.py 中的 entry_page 改成这样就可以了!:
def entry_page(request, entry):
if entry in util.list_entries():
name = entry # Places the title
text = util.get_entry(entry) # Grabs the entry using the util function
html = md_converter(text)
return render(request, "encyclopedia/entry.html", {
"title": name,
"entry": html
})
else:
return render(request, "encyclopedia/error_404.html" )
很高兴不是 Django 搞砸了,只是我搞砸了哈哈
更新:添加了我正在访问的引发错误的代码
对于我正在使用 wiki 页面的 CS50 项目,当用户键入 wiki/TITLE 中不存在的页面时,我尝试发送正确的自定义 404 错误,但是当我输入缺失的页面,Django 会抛出 500 而不是 404。这是常见错误还是我的错误消息有误?调试设置为 False,允许的主机在设置中配置为 ['*']:
这是我在 views.py 中的自定义错误处理程序:
def error_404(request, exception):
context = {}
response = render(request, 'encyclopedia/error_404.html', context=context)
response.status_code = 404
return response
def error_500(request):
context = {}
response = render(request, 'encyclopedia/error_500.html', context=context)
response.status_code = 500
return response
这是他们在 wiki/urls.py:
中的样子from django.contrib import admin
from django.urls import include, path
from django.conf.urls import handler404, handler500
urlpatterns = [
path('admin/', admin.site.urls),
path('', include("encyclopedia.urls")),
]
handler404 = "encyclopedia.views.error_404"
handler500 = "encyclopedia.views.error_500"
这里是 views.py 中的函数,我正在访问但要转到 wiki/C:
#function gets entry from index.html's <li>
def entry_page(request, entry):
name = entry # Places the title
print(f"checking the title: {entry}")
text = util.get_entry(entry) # Grabs the entry using the util function
html = md_converter(text)
if text is not None:
return render(request, "encyclopedia/entry.html", {
"title": name,
"entry": html
})
这是我的 urls.py 很好的衡量标准:
from django.urls import path
from . import views
app_name = "encyclopedia"
urlpatterns = [
path("", views.index, name="index"),
path("wiki/<str:entry>", views.entry_page, name="entry"),
path("wiki/edit/<str:title>", views.edit, name="edit"),
path("search", views.search, name="search"),
path("random", views.random_page, name="random"),
path("create_entry",views.create_entry, name="create_entry")
]
这是终端显示的内容(我的 styles.css 出于某种原因抛出 404,但我没有更改那里的任何内容...这是一个单独的问题):
您的代码可能有问题。 Django 文档清楚地说
The 404 view is also called if Django doesn’t find a match after checking every regular expression in the URLconf.
https://docs.djangoproject.com/en/3.2/ref/views/#error-views
想通了。谢谢你们。
我用来抓取页面的函数出错了。我在查找特定 wiki 条目时并没有检查 URL 是否有效。
将 views.py 中的 entry_page 改成这样就可以了!:
def entry_page(request, entry):
if entry in util.list_entries():
name = entry # Places the title
text = util.get_entry(entry) # Grabs the entry using the util function
html = md_converter(text)
return render(request, "encyclopedia/entry.html", {
"title": name,
"entry": html
})
else:
return render(request, "encyclopedia/error_404.html" )
很高兴不是 Django 搞砸了,只是我搞砸了哈哈