使用正则表达式动态重定向Django中的页面?

时间:2013-02-27 16:47:31

标签: python django url-routing

我在django中遇到 url.py 的问题。

在我的应用中,我有很多网址:

aaa-2011-bbb
aaa-2011

我想将这些网址重定向到没有年份的新网址。所以我需要从网址中删除一年。有可能吗?

我只有这样的静态映射:

(r'^aaa-\d{4}-bbb/$', redirect_to, {'url': '/aaa-bbb/'}),

但我不喜欢为每年的每个网址都写这个规则。

3 个答案:

答案 0 :(得分:2)

我会继承RedirectView并使用它来支持动态重定向

urls.py类似

(r'^(?P<aaa>\w+)-\d{4}-(?P<bbb>\w+)/$', MyRedirectView.as_view()),

并在views.py

from django.views.generic.base import RedirectView

class MyRedirectView(RedirectView):
    permanent = False
    query_string = True

    def get_redirect_url(self, aaa, bbb):
        return '%s-%s' % (aaa, bbb)

这会从**kwargs(假设为字符串和您描述的网址重定向)中获取aaa bbburls.py并返回一个重定向网址'%s-%s' % (aaa, bbb) 1}}

答案 1 :(得分:1)

正如@danodonovan所说,RedirectView是实现这一目标的最佳方法。

但是,为避免进一步不必要的重复,我提出以下建议:

# urls.py
(r"^([^/]*?(19|20)\d{2}[^/]*?)/?$", RemoveYearRedirect.as_view()),

# views.py
from django.views.generic.base import RedirectView
import re

class RemoveYearRedirect(RedirectView):
    query_string = True

    def get_redirect_url(self, **kwargs):
        """
        This has been overriden to remove any year from 1900 to 2099 from the URL
        """
        url = re.sub("(19|20)\d{2}", "", self.args[0])
        return "/" + re.sub("-+", "-", url).strip("-")

这适用于以下网址:

  • / testing-2012-foo - &gt; /测试-FOO
  • / 2000-never-happen - &gt; /从未发生
  • / movies-from-1960 - &gt; /电影-从

答案 2 :(得分:0)

使用更少代码执行相同操作的另一种方法:

(r'^(?P<aaa>\w+)-\d{4}-(?P<bbb>\w+)/$', RedirectView.as_view(url='%(aaa)s-%(bbb)s')),