我的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 /,杀死了我的鸟。
答案 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
中的每个网址来指定重定向视图,但这对于作为其他网址的命名空间的网址中的网址会变得混乱。