python - 支持旧的和新的 URI 版本都可以在不破坏 reverse() 的情况下工作

标签 python django

如何在不破坏 reverse() 的情况下支持旧的和新的 URI 版本?

例如,我有:

urlpatterns = patterns('',
    url(r'^(old_part|new_part)/other/$', 'some_view'),
)

在这种情况下,/old_part/other//new_part/other/ 指向相同的 View ,但 reverse() 方法失败,因为它不知道如何正确形成链接。

此外,如果我们有 url(r'^(old_part|new_part)/other/', include(sub_patterns)) 如何处理呢?

你有什么想法吗?

感谢您的帮助。

最佳答案

我想你正在迁移。这意味着你不希望旧的 url 工作,你希望它重定向到新的 url。可能带有 301 HTTP 代码(永久重定向)。

相同内容有多个 URL 会使您的网站更难使用并损害您的 SEO。永久重定向将告诉 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 通用 View 。

关于python - 支持旧的和新的 URI 版本都可以在不破坏 reverse() 的情况下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20684309/

相关文章:

django - 如何将 Pug/Jade 与 Django 条件和 html 元素属性混合?

python - 如何在 Robot Framework 中编写 if 语句的多个条件

python - Pickle类实例加上定义?

python - "Can' t 连接到 HTTPS URL,因为 SSL 模块不可用。”

python - Runserver的Unicodedecodeerror

python - 如何使用 Tox 和 Poetry 在 CircleCI 中设置多个解释器?

python - 比较日期字段的年月是否大于

python - 如何从特定的 Django 模型实例中获取所有 RelatedManagers?

python - SQLAlchemy 长时间运行的脚本 : User was holding a relation lock for too long

python - 有没有办法更改 Pandas 数据透视表的边距 "All"列位置?