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

Alias for app URI in Django project urls.py

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

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

"birds/" 是官方的、永久的基础 URI; "b/" 被接受为 shortcut/alias。

如何将 "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/,杀死我的鸟。

您可以制作一个 custom middleware 来为您处理重定向

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 来指定重定向视图,但这对于作为其他 urls.

你应该尝试这样的事情:

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')),
]