您的位置:首页 > 编程语言 > Python开发

Python/Django/Jinja2开发模式下Url QueryString的修改

2016-03-02 00:00 465 查看
urlhelper.py的代码,对于支持中文有两点需要注意:

使用parse_qs的时候,记得encode('utf-8')

添加或者更新qs的时候,记得encode('utf-8')

#! -*- coding: utf-8 -*-

from urllib import urlencode
from urllib import quote
from urlparse import parse_qs, urlsplit, urlunsplit

class UrlQueryString():
def __init__(self, req):
self.full_path = req.get_full_path()

def replace(self, **kwargs):
scheme, netloc, path, qs, fragment = urlsplit(self.full_path)
qs_dict = parse_qs(qs.encode('utf-8'))
# add kwargs to query string
for k,v in kwargs.iteritems():
qs_dict[k] = v.encode('utf-8') if hasattr(v, 'encode') else v
self.full_path = urlunsplit((scheme, netloc, path, urlencode(qs_dict, doseq=True), fragment))
return self

def append(self, **kwargs):
scheme, netloc, path, qs, fragment = urlsplit(self.full_path)
qs_dict = parse_qs(qs.encode('utf-8'))
# replace the querystring by the kwargs
for k,v in kwargs.iteritems():
v = v.encode('utf-8') if hasattr(v, 'encode') else v
if k in qs_dict.keys():
if isinstance(qs_dict[k], list):
qs_dict[k].append(v)
else:
qs_dict[k] = [qs_dict[k], v]
qs_dict[k] = list(set(qs_dict[k]))
else:
qs_dict[k] = v
self.full_path = urlunsplit((scheme, netloc, path, urlencode(qs_dict, doseq=True), fragment))
return self

def __unicode__(self):
return self.full_path

if __name__ == '__main__':
pass

简单增加一个函数,用在jinja2的Template中。

def&nbs
3ff0
p;url_qs(req):
return UrlQueryString(req)

注册jinja2的Enviroment,方便在Template中使用。


from __future__ import absolute_import  # Python 2 only
from jinja2 import Environment
from jinja2 import evalcontextfilter, Markup, escape
from PortalSite.urlhelper import UrlQueryString
from PortalSite.urlhelper import url_qs

def environment(**options):
env = Environment(**options)
env.filters['rdprofile'] = rdprofile
env.filters['rduser'] = rdcentre_user
env.filters['pinyin'] = pinyin_full_and_initial
env.globals.update({
'url_qs': url_qs,
'url': reverse, })
return env

在Template中使用的方法。(通过返回self,实现Fluent API)

<div class="table-div-right table-div-right-sm">
{% for sheet in datasets %}
<a href="{{url_qs(request).append(sheet=sheet).replace(count=1)}}">
<span class="label label-primary">{{sheet}}</span>
</a>
{% endfor %}
</div>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息