13

我喜欢在脚本的不同位置使用一些错误消息引发 404,例如:Http404("some error msg: %s" %msg) 所以,在我的 urls.py 中,我包括:

handler404 = Custom404.as_view()

谁能告诉我应该如何处理我的观点中的错误。我对 Django 很陌生,所以一个例子会有很大帮助。
提前谢谢了。

4

9 回答 9

10

一般来说,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',
)

这会成功的。如果我做错了什么,请纠正我。希望这可以帮助。

于 2013-05-12T08:53:28.110 回答
9

通常,404 错误是“找不到页面”错误 - 它不应该有可定制的消息,只是因为它应该只在找不到页面时引发。

您可以返回一个TemplateResponse状态参数设置为404

于 2013-05-07T09:03:22.567 回答
6

在视图中引发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快捷方式

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.htmltemplates文件夹中。

于 2017-02-13T01:20:44.873 回答
3

是的,我们可以在引发 Http404 时显示特定的异常消息。

像这样传递一些异常消息

raise Http404('Any kind of message ')

将 404.html 页面添加到模板目录中。

模板/404.html

{{exception}}
于 2019-03-15T06:37:23.697 回答
3

在更改了很多中间件后,我找到了 Django 2.2 (2019) 的解决方案。这与穆罕默德 2013 年的回答非常相似。所以这里是:

中间件.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',

于 2019-04-24T21:18:54.227 回答
2

如果您想为特定视图引发某种静态消息,您可以执行以下操作:-

from django.http import Http404

def my_view(request):
  raise Http404("The link seems to be broken")
于 2018-12-17T13:12:35.340 回答
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)
于 2013-05-07T13:43:16.153 回答
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。

于 2018-04-10T02:09:51.027 回答
0

默认的 404 处理程序调用 404.html 。如果您不需要任何花哨的东西,或者可以通过设置 handler404 视图来覆盖 404 处理程序,您可以对其进行编辑——在此处查看更多信息

于 2013-05-07T09:06:21.717 回答