Django-尝试使用 APPEND_SLASH 和自定义包罗万象的 404 视图

发布于 2024-11-03 09:06:44 字数 914 浏览 1 评论 0原文

我通常会在 Django 网站中添加一个包罗万象的 404 正则表达式,作为 urls.py 中的最后一个表达式:

urlpatterns += patterns('django.views.generic.simple',
    (r'^.', 'direct_to_template', {'template': 'unknown.html'}),

我通常对此性能感到满意。 known.html 模板扩展了我的基本模板,并很好地告诉查看者他们输入的 url 不存在,但该页面仍然具有我网站的所有导航和样式。

然而,在不得不反复告诉人们输入尾部斜杠之后,我觉得需要设置settings.py中的APPEND_SLASH = True参数。

文档指出:

如果 APPEND_SLASH 为 True 并且 初始 URL 不以斜杠结尾, 并且在 URLconf 中找不到它, 然后通过附加形成一个新的 URL 末尾有一个斜杠。如果这个新 URL 是 在URLconf中找到,然后Django 将请求重定向到这个新 URL。 否则,初始 URL 为 照常处理。

因此,按照这个逻辑,foo.com/bar 会被我的“404”url 表达式成功捕获,然后才能重定向到我的 foo.com/bar/ url 表达式。 *

维护友好/自定义的包罗万象的 404 页面同时还能够使用 APPEND_SLASH 或具有类似功能的内容的最佳方法是什么?*



--编辑/回答--

不知怎的,我错过了你只需要添加一个名为 404.html 的模板,并确保 DEBUG = False

谢谢DTing!

I generally add a catch-all 404 regex to my Django websites as the last expression in my urls.py:

urlpatterns += patterns('django.views.generic.simple',
    (r'^.', 'direct_to_template', {'template': 'unknown.html'}),

I'm generally happy with the performance of this. The unknown.html template extends my base template and nicely tells the viewer that their entered url doesn't exist, but the page still has all the navigation and style of my website.

However, after having to repeatedly tell people to enter a trailing slash, I feel that the APPEND_SLASH = True parameter in settings.py needs to be set.

the docs state:

If APPEND_SLASH is True and the
initial URL doesn’t end with a slash,
and it is not found in the URLconf,
then a new URL is formed by appending
a slash at the end. If this new URL is
found in the URLconf, then Django
redirects the request to this new URL.
Otherwise, the initial URL is
processed as usual.

So following this logic, foo.com/bar is successfully caught by my "404" url expression before it can be redirect to my foo.com/bar/ url expression.
*

What is the best way to maintain a friendly/custom catchall 404 page while also being able to use APPEND_SLASH or something with similar functionality?*

--edit/answer--

Somehow I missed that you just need to add a template named 404.html, and also make sure DEBUG = False

Thanks DTing!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

第几種人 2024-11-10 09:06:44

我认为您可以自定义 404.html 而不是使用“catchall”,因为您只是重定向到自定义模板。您的自定义 404.html 模板没有理由无法扩展您网站的 base.html。

http://docs.djangoproject.com/en/ dev/topics/http/views/#customizing-error-views

关于 404 浏览量需要注意的三件事:

  • 如果 Django 在之后没有找到匹配项,也会调用 404 视图
    检查中的每个正则表达式
    URLconf。
  • 如果您没有定义自己的 404 视图,而只是使用默认值,
    这是推荐的——你仍然有
    一项义务:您必须创建一个
    404.html 模板位于模板目录的根目录中。默认404
    视图将为所有视图使用该模板
    404 错误。默认的 404 视图将
    将一个变量传递给模板:
    request_path,这是请求的 URL
    结果是 404。
  • 404 视图会传递一个 RequestContext 并且可以访问
    您提供的变量
    TEMPLATE_CONTEXT_PROCESSORS 设置
    (例如,MEDIA_URL)。
  • 如果 DEBUG 设置为 True(在您的设置模块中),那么您的 404 视图
    永远不会被使用,并且回溯
    将会显示。

如果您确实想使用自定义视图,

此 page_not_found 视图应该
足以满足 99% 的 Web 应用程序,
但如果你想覆盖 404
视图中,您可以在中指定handler404
你的 URLconf,如下所示:

handler404 = 'mysite.views.my_custom_404_view'

I think you can just customize your 404.html instead of using a "catchall" since you are just redirecting to a custom template. There is no reason why your custom 404.html template can't extend your site's base.html.

http://docs.djangoproject.com/en/dev/topics/http/views/#customizing-error-views

Three things to note about 404 views:

  • The 404 view is also called if Django doesn't find a match after
    checking every regular expression in
    the URLconf.
  • If you don't define your own 404 view -- and simply use the default,
    which is recommended -- you still have
    one obligation: you must create a
    404.html template in the root of your template directory. The default 404
    view will use that template for all
    404 errors. The default 404 view will
    pass one variable to the template:
    request_path, which is the URL that
    resulted in the 404.
  • The 404 view is passed a RequestContext and will have access to
    variables supplied by your
    TEMPLATE_CONTEXT_PROCESSORS setting
    (e.g., MEDIA_URL).
  • If DEBUG is set to True (in your settings module), then your 404 view
    will never be used, and the traceback
    will be displayed instead.

if you do want to use a custom view,

This page_not_found view should
suffice for 99% of Web applications,
but if you want to override the 404
view, you can specify handler404 in
your URLconf, like so:

handler404 = 'mysite.views.my_custom_404_view'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文