Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django URLconf:在保留URL'的同时重定向;s查询部分和unicode_Python_Django_Unicode - Fatal编程技术网

Python Django URLconf:在保留URL'的同时重定向;s查询部分和unicode

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

通常情况下,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.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}),
)