繁体   English   中英

Django URLconf:重定向,同时保留URL的查询部分和unicode

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM