如何在不破坏reverse()的情况下支持新旧URI版本?
例如,我有:
urlpatterns = patterns('',
url(r'^(old_part|new_part)/other/$', 'some_view'),
)
在这种情况下,/old_part/other/
和/new_part/other/
指向同一视图,但reverse()方法失败,因为它不知道如何正确形成链接。
另外,如果我们有url(r'^(old_part|new_part)/other/', include(sub_patterns))
怎么办呢?
你有什么想法吗?
感谢您的帮助。
答案 0 :(得分:3)
我想你正在迁移。这意味着您不希望旧网址工作,您希望它重定向到新网址。可能使用301 HTTP代码(永久重定向)。
有几个相同内容的网址会使您的网站更难使用并损害您的搜索引擎优化。永久重定向将告知Google和任何其他搜索引擎使用新地址重新索引页面。
你可以在Django中这样做:
from django.views.generic import RedirectView
urlpatterns = patterns('',
url(r'^new_part/other/$', 'some_view'),
url(r'^old_part/other/$',
RedirectView.as_view(url='new_part/other/', permanent=True)),
)
如果您需要使用子路径捕获所有内容,则可以捕获URL结尾并将其添加到以这种方式重定向URL:
urlpatterns = patterns('',
url(r'^new_part/other/$', include(sub_patterns)),
url(r'^old_part/other/(?P<rest>.*)$',
RedirectView.as_view(url='new_part/other/%(rest)s', permanent=True)),
)
您可以在Django 1.4及更早版本中使用redirect_to
通用视图。
答案 1 :(得分:1)
如果你想要没有重定向,你可以尝试这个
url(r'^(?P<url>old_part|new_part)/other/$', 'some_view', name='some_view'),
然后您的视图将如下所示
def some_view(request, url):
...
然后像这样调用反向:
# will return /old_part/other/
reverse('some_view', kwargs={'url': 'old_part'})
# will return /new_part/other/
reverse('some_view', kwargs={'url': 'new_part'})
答案 2 :(得分:0)
只需将旧网址重定向到新网址(301移动永久)。
注意:如果你确实坚持支持两组网址(不是一个好主意恕我直言),你必须有两个不同的网址模式,并选择哪一个reverse()
应该解决。