Django项目中的app URI的别名urls.py

时间:2017-01-30 14:48:07

标签: django django-urls django-apps

我的Django项目"动物"有一个名为" birds"的应用程序。在动物/ urls.py中,#34;鸟类#34; URI将路由到birds / urls.py,如下所示:

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

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

我怎样才能拥有" b /" URI(永久)重定向到" birds /",这样即使用户可以输入" b / penguin",浏览器的地址栏也会(最终)显示"鸟类/企鹅&#34 ;?我不想触及“鸟类”中的任何代码。应用程序,因为它不应该知道(关心)项目如何将URI映射到应用程序。

我尝试过使用

RedirectView.as_view(pattern_name='birds'))

但这导致410 Gone响应。和

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

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

2 个答案:

答案 0 :(得分:5)

你应该尝试类似的东西:

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

答案 1 :(得分:0)

您可以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中的每个网址来指定重定向视图,但这对于作为其他网址的命名空间的网址中的网址会变得混乱。