【问题标题】:Can you have more than one app handle a 404 in Django?你可以在 Django 中让多个应用程序处理 404 吗?
【发布时间】:2010-10-22 04:57:42
【问题描述】:

显然,Django flatpages 的工作方式是处理其他应用程序抛出的 404。我想知道我是否可以在 flatpages 之前做另一个 flatpages 类型的应用程序,它会在 404 上获得破解。到目前为止,我尝试了这个但没有成功。一个模板被渲染,但数据没有通过。

有可能吗?

【问题讨论】:

    标签: django http-status-code-404 django-flatpages


    【解决方案1】:

    根据 Django 文档,您可以将自己的视图指定为 404 或 500 处理程序:

    handler404 = 'mysite.views.my_custom_404_view'
    

    因此,您的应用可以在 views.py 中定义自定义错误处理视图,您可以在 urls.py 中将其设置为 404 或 500 视图的处理程序

    有关详细信息,请参阅“Customizing Error views”。

    【讨论】:

    • 只有在我将 handler404 放入我的主 urls.py 时才有效。如果我有多个应用程序并且每个应用程序都应该有自己的处理程序 404 怎么办。例如。 web-gui 应用程序是一个不错的 html 页面,而 rest-api 是一个 json 响应?
    【解决方案2】:

    内置平面应用程序的工作方式是使用 some middleware:中间件有一个名为“process_response”的函数,用于检查 404 状态代码的传出响应。如果响应是 404,并且 URL 与平面页面匹配,则中间件会抑制 404 并返回呈现的平面页面。

    您可以用自己的中间件做同样的事情。为确保在平面页面代码之前调用您的代码,您的中间件应该在您的MIDDLEWARE_CLASSES 设置中平面页面之后出现:

    # in settings.py
    MIDDLEWARE_CLASSES = (
        # ...
        'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
        'myapp.middleware.MyMiddlewareClass',
    )
    

    之所以在它之后而不是之前是因为在响应阶段 Django 以相反的顺序应用中间件。

    【讨论】:

    • 感谢您的建议。中间件顺序很有趣。我尝试颠倒顺序,但对我的情况没有任何影响。
    猜你喜欢
    • 1970-01-01
    • 2018-08-09
    • 2013-05-29
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多