Django - 如果没有 url 匹配则重定向到主页

Django - redirecting to home page if no url matched

基本上,我的目标是在 URLConf 中没有与请求的 url 匹配的情况下将用户重定向到呈现 index.html 的视图。然后,在客户端,我会适当地管理路由或显示 404 页面。

所以基本上,问题是,

  1. 如何在 Django 中实现这种重定向?我试过这个:

    url(r'^(.*)$', views.index),
    

    ...一些其他 urls

...毫不奇怪,(.*) 意味着所有 url 都被重定向到 index.html,无论它是否匹配任何其他 URL .那么我应该把它放在 url 列表的最后吗?我觉得我应该使用某种中间件,或者 Django 有解决这个问题的本机方法?

  1. 这对我的休息应用程序的用户来说是一个令人不快的副作用。每次它们都是无效的 URL,它们会得到 HTML(实际上是 HTML for home.html)而不是 json 或 404 错误。好吧,index.html 代码并没有什么难看的地方,但这听起来像是个坏主意。那么我是否会分离这个逻辑以便 REST 应用程序的用户收到 404 错误而不是被重定向到 index.html?这主要是关于编码模式,而不是 Django 本身。然而,我也非常感谢对此的任何评论:)

您可以在 URL 配置的末尾添加 catch all,但这会导致一些意外行为(例如,从 /my-page 重定向到 /my-page/(附加斜线)否更长的工作时间)。

更好的方法是编写一个自定义 middleware. You could look at the redirect middleware 来获取灵感,因为它可以处理重定向。

如果您不想重定向 API 请求,您可以在您的中间件中添加一个检查。例如,您无法重定向 URL 以 /api/ 开头的请求,或者请求具有 Accept: application/json header.

另一种选择是使用呈现索引页的 custom 404 handler。同样,在处理程序中你有 request object,所以你可以不同地处理 API 请求。