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