我喜欢在脚本的不同位置提出404错误消息,例如:Http404("some error msg: %s" %msg)
所以,在我的urls.py中,我包括:
handler404 = Custom404.as_view()
任何人都可以告诉我如何在我的观点中处理错误。我对Django很新,所以一个例子会有很多帮助 非常感谢提前。
答案 0 :(得分:7)
一般情况下,404错误中不应该有任何自定义消息,如果要实现它,可以使用django中间件执行此操作。
<强>中间件强>
from django.http import Http404, HttpResponse
class Custom404Middleware(object):
def process_exception(self, request, exception):
if isinstance(exception, Http404):
# implement your custom logic. You can send
# http response with any template or message
# here. unicode(exception) will give the custom
# error message that was passed.
msg = unicode(exception)
return HttpResponse(msg, status=404)
中间件设置
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'college.middleware.Custom404Middleware',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
这样就可以了。如果我做错任何事,请纠正我。希望这会有所帮助。
答案 1 :(得分:6)
答案 2 :(得分:2)
在视图中引发Http404
异常。通常在捕获DoesNotExist
异常时完成。例如:
from django.http import Http404
def article_view(request, slug):
try:
entry = Article.objects.get(slug=slug)
except Article.DoesNotExist:
raise Http404()
return render(request, 'news/article.html', {'article': entry, })
更好的是,使用get_object_or_404
shortcut:
from django.shortcuts import get_object_or_404
def article_view(request):
article = get_object_or_404(MyModel, pk=1)
return render(request, 'news/article.html', {'article': entry, })
如果您要自定义默认的404 Page not found
响应,请将您自己的名为404.html
的模板放到templates
文件夹中。
答案 3 :(得分:2)
在许多中间件发生变化之后,我想出了针对Django 2.2(2019)的解决方案。这与穆罕默德(Muhammed)在2013年的回答非常相似。因此,它是:
middleware.py
from django.http import Http404, HttpResponse
class CustomHTTP404Middleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# Code to be executed for each request before the view (and later middleware) are called.
response = self.get_response(request)
# Code to be executed for each request/response after the view is called.
return response
def process_exception(self, request, exception):
if isinstance(exception, Http404):
message = f"""
{exception.args},
User: {request.user},
Referrer: {request.META.get('HTTP_REFERRER', 'no referrer')}
"""
exception.args = (message,)
此外,最后一次将它添加到settings.py中的中间件中:'app.middleware.http404.CustomHTTP404Middleware',
答案 4 :(得分:1)
您可以返回带有状态代码的普通HttpResponse对象(在本例中为404)
from django.shortcuts import render_to_response
def my_view(request):
template_context = {}
# ... some code that leads to a custom 404
return render_to_response("my_template.html", template_context, status=404)
答案 5 :(得分:1)
在我的情况下,我想在返回自定义404页面之前采取一些操作(例如日志记录)。这是执行它的404处理程序。
def my_handler404(request, exception):
logger.info(f'404-not-found for user {request.user} on url {request.path}')
return HttpResponseNotFound(render(request, "shared/404.html"))
请注意,HttpResponseNotFound
是必需的。否则,响应的HTTP状态代码为200。
答案 6 :(得分:0)
默认的404处理程序调用404.html。您可以编辑它,如果您不需要任何花哨的东西或可以通过设置handler404视图覆盖404处理程序 - see more here
答案 7 :(得分:0)
如果要为特定视图引发某种静态消息,可以执行以下操作:-
from django.http import Http404
def my_view(request):
raise Http404("The link seems to be broken")
答案 8 :(得分:0)
是的,我们可以在引发Http404时显示特定的异常消息。
传递这样的异常消息
raise Http404('Any kind of message ')
将404.html页面添加到模板目录中。
templates / 404.html
{{exception}}