Skip to content

Instantly share code, notes, and snippets.

@jackiect
Last active May 5, 2016 08:04
Show Gist options
  • Save jackiect/a9e6f85063cc7086277dd5e0b0dfd758 to your computer and use it in GitHub Desktop.
Save jackiect/a9e6f85063cc7086277dd5e0b0dfd758 to your computer and use it in GitHub Desktop.
python flask/jinja...

jinja渲染模版时,参数中的非ASCII内容必须是unicode类型

所以以下写法均会抛出UnicodeDecodeError

  • template.render(name="校长")
  • template.render(re={"name": "校长"})

结论二

  • jinja模版中,字符串字面量如{{ }},local变量等中显示给出字符串数据可以是str或unicode,即{{ "校长" }}{{ u"校长" }}都是正确的,{% set a, b = '校长', u'校长' %}
  • 传给jinja模版中的python变量中的字符串数据必须是unicode,这些变量包括global变量、context变量和filters函数返回的值

python flask/jinja...

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from jinja2 import Template, UndefinedError
import pytest
from attrdict import AttrDict
def test_print():
print "hello"
assert True
def test_simple():
template = Template("Hello {{name}} from:{{sender}}")
assert "Hello Jack from:Lucy" == template.render(name="Jack", sender="Lucy")
assert "Hello Jack from:" == template.render(name="Jack")
assert u"Hello Jack from:" == template.render(name="Jack")
assert "Hello Jack from:" == template.render(name=u"Jack")
assert u"Hello Jack from:Lucy" == template.render(name=u"Jack", sender="Lucy")
assert type(template.render(name=u"Jack", sender="Lucy")) is unicode
def test_ch():
template = Template("Hello {{name}} from:{{sender}}")
with pytest.raises(UnicodeDecodeError):
assert "Hello Jack from:校长" == template.render(name="Jack", sender="校长")
assert u"Hello Jack from:校长" == template.render(name="Jack", sender=u"校长")
assert "Hello Jack from:校长" != template.render(name="Jack", sender=u"校长")
common_template = "Hi {{msg}}. My name is {{user.name}}, and {{user.age}} years old. I come from {{user.country}}"
common_render = "Hi everyone. My name is jack, and 18 years old. I come from China"
common_render_none = "Hi . My name is , and years old. I come from "
def test_dict():
template = Template(common_template)
user = {
"name": "jack",
"age": 18,
"country": "China",
}
result = template.render(user=user, msg="everyone")
assert common_render == result
assert type(result) is unicode
user = {
'name': u"jack",
u'age': "18",
u'country': u"China",
}
result = template.render(user=user, msg="everyone")
assert common_render == result
assert type(result) is unicode
def test_None():
template = Template("Hello {{name}} from:{{sender}}")
assert "Hello from:" == template.render()
assert "Hello None from:" == template.render(name=None)
template = Template(common_template)
with pytest.raises(UndefinedError):
result = template.render(msg="world")
assert common_render_none == template.render(user=None)
assert template.render(user={}) == template.render(user=None)
assert template.render(user=object()) == template.render(user=None)
assert template.render(user=AttrDict({})) == template.render(user=None)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment