[英]Django URLconf: redirect while preserving URL's query part and unicode
通常,URLconf中的重定向是这样完成的:
from django.views.generic.simple import redirect_to
urlpatterns = patterns('django.views.generic.simple',
(ur'^old/$', 'redirect_to', {'url': ur'/new/', 'permanent': False}),
)
另外,我需要GET查询才能保留在原位( domain.com/old/?p=0
=> domain.com/new/?p=0
)。
我这样做是这样的:
from django.views.generic.simple import redirect_to
urlpatterns = patterns('django.views.generic.simple',
(ur'^old/$', lambda request, url, permanent: redirect_to(request = request, url = url + (request.META['QUERY_STRING'] and ('?'+request.META['QUERY_STRING'])), permanent = permanent), {'url': ur'/new/', 'permanent': False}),
)
而且效果很好。
继续使用命名的正则表达式组:
from django.views.generic.simple import redirect_to
urlpatterns = patterns('django.views.generic.simple',
(ur'^old/(?P<id>\d+)/$', lambda request, url, permanent, id: redirect_to(request = request, url = url + (request.META['QUERY_STRING'] and ('?'+request.META['QUERY_STRING'])), permanent = permanent, id = id), {'url': ur'/new/%(id)s/', 'permanent': False}),
)
经过测试,效果很好。
我坚持的地方:如果查询值中包含Unicode字符,例如?city=Orléans
,它将遇到:
Exception Type: TypeError
Exception Value: not enough arguments for format string
Exception Location: /usr/local/lib/python2.5/site-packages/django/views/generic/simple.py in redirect_to, line 39
URL“百分比编码”中的“Orléans”是“ Orl%C3%A9ans”: URI和IRI处理
因此redirect_to
会尝试解析此'%'。
解决方案是对查询字符串进行解码以摆脱“%”,例如使用urllib2.unquote
所以最终的代码将是:
from django.views.generic.simple import redirect_to
from urllib2 import unquote
urlpatterns = patterns('django.views.generic.simple',
(ur'^old/(?P<id>\d+)/$', lambda request, url, permanent, id: redirect_to(request = request, url = url + (request.META['QUERY_STRING'] and ('?'+unquote(request.META['QUERY_STRING']).decode("utf8"))), permanent = permanent, id = id), {'url': ur'/new/%(id)s/', 'permanent': False}),
)
任何人都可以使它看起来更好吗? :)
更新资料
django.views.generic.simple.redirect_to中提到了另一个解决方案:
因为总是执行关键字插值(即使没有传入任何参数),所以URL中的任何“%”字符都必须写为“ %%”,以便Python将它们转换为输出时的单个百分号。
更新资料
从Django 1.3开始,内置了基于类的视图RedirectView ,可以轻松完成所有工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.