Django 项目中应用程序 URI 的别名 urls.py



我的Django项目"animals"有一个名为"birds"的应用程序。 在 animals/url 中.py"birds"URI 被路由到 birds/urls.py如下所示:

urlpatterns=[
    url(r'^birds/', include('birds.urls')),
    url(r'^b/',     include('birds.urls')), # alias
]

"birds/"是官方的永久基本URI;"b/"被接受为快捷方式/别名。

如何将"b/"URI(永久)重定向到"birds/",这样即使用户可以输入"b/penguin",浏览器的地址栏也会(最终)显示"birds/penguin"? 我宁愿不接触"birds"应用程序中的任何代码,因为它不应该知道(关心)项目如何将 URI 映射到应用程序。

我尝试使用

RedirectView.as_view(pattern_name='birds'))

但这会导致 410 Gone 响应。 和

RedirectView.as_view(url='/birds/'))

将/b/penguin 重定向到/birds/,杀死我的鸟。

你应该尝试这样的事情:

from django.views.generic import RedirectView
urlpatterns=[
    url(r'^birds/', include('birds.urls')),
    url(r'^b/(?P<path>.*)$', RedirectView.as_view(url='/birds/%(path)s')),
]

您可以创建自定义中间件来为您处理重定向

class BirdMiddleware(MiddlewareMixin, object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        if '/b/' in request.path:
             return HttpResponseRedirect(request.path.replace('/b/', '/birds/'))
        return None

实现可能需要一些工作,但实际方法仍然存在,检查当前路径,如果存在/b/,则将其重定向到所需的目标。

否则,您可以通过遍历birds中的每个 url 来指定重定向视图,但对于作为其他 url 命名空间的鸟类中的 url,这会变得混乱。

相关内容

  • 没有找到相关文章

最新更新