我的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,这会变得混乱。