Python Django URLconf:在保留URL'的同时重定向;s查询部分和unicode
通常情况下,URLconf中的重定向如下所示:Python Django URLconf:在保留URL'的同时重定向;s查询部分和unicode,python,django,unicode,Python,Django,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}), ) 此外,我需要获取查询以保持原位(domain.com/old/?p=0=>domain
from django.views.generic.simple import redirect_to
urlpatterns = patterns('django.views.generic.simple',
(ur'^old/$', 'redirect_to', {'url': ur'/new/', 'permanent': False}),
)
此外,我需要获取查询以保持原位(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}),
)
URL“百分比编码”中的“Orléans”是“Orl%C3%A9ans”: 因此,
redirect_to
falls试图解析这个“%”
解决方案是解码查询字符串以除去“%”,例如使用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 import重定向到
从urllib2导入unquote
urlpatterns=patterns('django.views.generic.simple',
(ur“^old/(?P\d+)/$”,lambda请求,url,permanent,id:redirect_to(request=request,url=url+(request.META['QUERY\u STRING']和(“?”+unquote(request.META['QUERY\u STRING']),permanent=permanent,id=id),{url:ur'/new/%(id)s/','permanent':False}),
)
有人能让它看起来更好吗?:)
更新
另一种解决方案在以下章节中提到:
因为关键字插值总是完成的(即使没有传入任何参数),所以URL中的任何“%”字符都必须写为“%%”,以便Python将它们转换为单百分比登录输出
更新
自Django 1.3以来,有一个内置的基于类的视图,可以轻松完成所有工作
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}),
)