基本上,我的目标是在 URLConf 中没有与请求的 url 匹配的情况下将用户重定向到呈现 index.html 的 View 。然后,在客户端,我会适本地管理路由或显示 404 页面。
所以基本上,问题是,
如何在 Django 中实现这种重定向?我试过这个:
url(r'^(.*)$', views.index),...其他一些 url
...毫不奇怪,(.*) 意味着所有 url 都被重定向到 index.html,无论它是否与任何其他 URL 匹配。那么我应该把它放在 url 列表的最后吗?我觉得我应该使用某种中间件,或者 Django 有一种 native 方法来解决这个问题?
- 这对我的休息应用程序的用户来说是一个令人不快的副作用。每次他们都是一个无效的 URL,他们会得到 HTML(实际上是 home.html 的 HTML)而不是 json 或 404 错误。好吧,index.html 代码并没有什么难看的地方,但它听起来像是个坏主意。那么我是否会分离这个逻辑以便 REST 应用程序的用户得到 404 错误而不是被重定向到 index.html?这主要是关于编码模式,而不是 Django 本身。然而,我也非常感谢对此的任何评论:)
请您参考如下方法:
您可以在 URL 配置的末尾添加 catch all,但这会导致一些意外行为(例如,从 /my-page 重定向到 /my-page/(附加斜杠)不再有效)。
更好的方法是编写自定义 middleware .你可以看看 redirect middleware获取灵感,因为它处理重定向。
如果您不想重定向 API 请求,您可以向您的中间件添加一个检查。例如,您无法重定向 URL 以 /api/ 开头的请求,或者请求具有 Accept: application/json header 。
另一种选择是使用 custom 404 handler呈现您的索引页面。同样,在处理程序中您有 request 对象,因此您可以以不同方式处理 API 请求。
