如何在 Django 中正确设置自定义 handler404?
How to properly setup custom handler404 in django?
根据 documentation 这应该相当简单:我只需要定义 handler404
。目前我正在做,在我的顶部 urls.py
:
urlpatterns = [
...
]
handler404 = 'myapp.views.handle_page_not_found'
应用程序已安装。对应的视图就是(暂时我只想在404的情况下重定向到首页):
def handle_page_not_found(request):
return redirect('homepage')
但这没有任何效果:显示标准(调试)404
页面。
文档有点含糊:
- 应该在哪里定义
handler404
?文档在 URLconf
中说,但是,具体在哪里?我有几个应用程序,每个应用程序都有不同的 urls.py
。我可以把它放在其中任何一个吗?在上面URLconf
?为什么?这记录在哪里?
- 这个处理程序会捕获什么?它会捕获
django.http.Http404
、django.http.HttpResponseNotFound
、django.http.HttpResponse
(使用 status=404
)吗?
正如我们所讨论的,您的设置是正确的,但在 settings.py 中您应该 DEBUG=False
。它更像是一个生产功能,不会在开发环境中工作(当然,除非你在开发机器中有 DEBUG=False
)。
Debug 应为 False 并添加到视图 *args
和 **kwargs
。添加到 urls.py handler404 = 'view_404'
def view_404(request, *args, **kwargs):
return redirect('https://your-site/404')
如果我没有添加 args 和 kwargs 服务器得到 500。
要在自定义页面上呈现 404 错误响应,请执行以下操作:
在你的项目目录中打开settings.py
并修改DEBUG
如下:
DEBUG = False
在同一目录中创建一个文件并将其命名为views.py
,插入以下代码:
from django.shortcuts import render
def handler404(request, exception):
return render(request, 'shop/shop.html')
最后打开同项目目录下的urls.py
文件,添加如下代码:
from django.contrib import admin
from . import views
handler404 = views.handler404
urlpatterns = [
path('admin/', admin.site.urls),
]
所有其他答案都不是最新的。以下是 Django 3.1 中对我有用的内容:
urls.py
from django.conf.urls import handler404, handler500, handler403, handler400
from your_app_name import views
handler404 = views.error_404
handler500 = views.error_500
views.py
def error_404(request, exception):
context = {}
return render(request,'admin/404.html', context)
def error_500(request):
context = {}
return render(request,'admin/500.html', context)
请注意,您必须编辑此代码以在 urls.py 的导入语句中反映您的应用程序名称,并在 views.py 中反映您的 html 模板的路径。
根据 documentation 这应该相当简单:我只需要定义 handler404
。目前我正在做,在我的顶部 urls.py
:
urlpatterns = [
...
]
handler404 = 'myapp.views.handle_page_not_found'
应用程序已安装。对应的视图就是(暂时我只想在404的情况下重定向到首页):
def handle_page_not_found(request):
return redirect('homepage')
但这没有任何效果:显示标准(调试)404
页面。
文档有点含糊:
- 应该在哪里定义
handler404
?文档在URLconf
中说,但是,具体在哪里?我有几个应用程序,每个应用程序都有不同的urls.py
。我可以把它放在其中任何一个吗?在上面URLconf
?为什么?这记录在哪里? - 这个处理程序会捕获什么?它会捕获
django.http.Http404
、django.http.HttpResponseNotFound
、django.http.HttpResponse
(使用status=404
)吗?
正如我们所讨论的,您的设置是正确的,但在 settings.py 中您应该 DEBUG=False
。它更像是一个生产功能,不会在开发环境中工作(当然,除非你在开发机器中有 DEBUG=False
)。
Debug 应为 False 并添加到视图 *args
和 **kwargs
。添加到 urls.py handler404 = 'view_404'
def view_404(request, *args, **kwargs):
return redirect('https://your-site/404')
如果我没有添加 args 和 kwargs 服务器得到 500。
要在自定义页面上呈现 404 错误响应,请执行以下操作:
在你的项目目录中打开settings.py
并修改DEBUG
如下:
DEBUG = False
在同一目录中创建一个文件并将其命名为views.py
,插入以下代码:
from django.shortcuts import render
def handler404(request, exception):
return render(request, 'shop/shop.html')
最后打开同项目目录下的urls.py
文件,添加如下代码:
from django.contrib import admin
from . import views
handler404 = views.handler404
urlpatterns = [
path('admin/', admin.site.urls),
]
所有其他答案都不是最新的。以下是 Django 3.1 中对我有用的内容:
urls.py
from django.conf.urls import handler404, handler500, handler403, handler400
from your_app_name import views
handler404 = views.error_404
handler500 = views.error_500
views.py
def error_404(request, exception):
context = {}
return render(request,'admin/404.html', context)
def error_500(request):
context = {}
return render(request,'admin/500.html', context)
请注意,您必须编辑此代码以在 urls.py 的导入语句中反映您的应用程序名称,并在 views.py 中反映您的 html 模板的路径。