在Jinja的nl2br过滤器中避免Python UnicodeDecodeError [英] Avoiding Python UnicodeDecodeError in Jinja's nl2br filter
问题描述
从jinja2 import import
导入environmentfilter,标记,转义
_paragraph_re = re.compile(r'(?:\r\\\
| \r | \\\
){2,}')
@evalcontextfilter
def nl2br(eval_ctx,value):
result = u'\\\
\\\
'.join(u'< p>%s< / p>%p.replace ('\ n','< br> \\\
')
for _paragraph_re.split(escape(value)))
if eval_ctx.autoescape:
result = Markup (结果)
返回结果
问题是如果value只有ascii字符(例如:/mɒntænə/导致它失败)。我得到这个错误:
$ b $ pre $ Traceback(最近调用最后一个):
文件/ usr / local / lib / python2.6 / dist-packages / Flask-0.6.1-py2.6.egg / flask / app.py,第889行,在__call__
返回self.wsgi_app(environ,start_response)
文件/usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/app.py,第879行,在wsgi_app
response = self.make_response( self.handle_exception(e))
文件/usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/app.py,第876行,在wsgi_app
rv = self.dispatch_request()
文件/usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/app。 py,第695行,在dispatch_request
返回self.view_functions [rule.endpoint](** req.view_args)
文件/home/mcrittenden/Dropbox/Code/dropdo/dropdo.py,第105行,
返回render_template(template,src = url,data = content)
文件/usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2 .6.egg /瓶/ templating.p y,第85行,在render_template
上下文中,ctx.app)
文件/usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg /flask/templating.py,第69行,在_render
rv = template.render(context)
文件/usr/local/lib/python2.6/dist-packages/Jinja2-2.5。 5-py2.6.egg / jinja2 / environment.py,第891行,渲染
返回self.environment.handle_exception(exc_info,True)
文件/ home / mcrittenden / Dropbox / Code / / home / mcrittenden / Dropbox / Code / dropdo / templates中的dropdo / templates / text.html,第1行,位于顶层模板代码中
{%extendslayout.html%}
/layout.html,第25行,顶级模板代码
{%block content%} {%endblock%}
文件/ home / mcrittenden / Dropbox / Code / dropdo / templates / text .html,第8行,在块内容中
{{data | nl2br}}
文件/home/mcrittenden/Dropbox/Code/dropdo/dropdo.py,第26行,在nl2br
for _paragraph_re.split(escape(value)))
UnicodeDecodeError:'ascii'code c无法解码位置12中的字节0xc9:序号不在范围内(128)
什么是最好的防止错误,但不能完全删除问题的字符?
unicode
文字无处不在。 Unicode in Python,Completely揭秘
I'm using Jinja2's nl2br filter, which looks like:
import re
from jinja2 import environmentfilter, Markup, escape
_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}')
@evalcontextfilter
def nl2br(eval_ctx, value):
result = u'\n\n'.join(u'<p>%s</p>' % p.replace('\n', '<br>\n')
for p in _paragraph_re.split(escape(value)))
if eval_ctx.autoescape:
result = Markup(result)
return result
The problem is if "value" has anything but ascii characters (for example: "/mɒnˈtænə/" causes it to fail). I get this error:
Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/app.py", line 889, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/app.py", line 879, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/app.py", line 876, in wsgi_app
rv = self.dispatch_request()
File "/usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/app.py", line 695, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/mcrittenden/Dropbox/Code/dropdo/dropdo.py", line 105, in view
return render_template(template, src = url, data = content)
File "/usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/templating.py", line 85, in render_template
context, ctx.app)
File "/usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/templating.py", line 69, in _render
rv = template.render(context)
File "/usr/local/lib/python2.6/dist-packages/Jinja2-2.5.5-py2.6.egg/jinja2/environment.py", line 891, in render
return self.environment.handle_exception(exc_info, True)
File "/home/mcrittenden/Dropbox/Code/dropdo/templates/text.html", line 1, in top-level template code
{% extends "layout.html" %}
File "/home/mcrittenden/Dropbox/Code/dropdo/templates/layout.html", line 25, in top-level template code
{% block content %}{% endblock %}
File "/home/mcrittenden/Dropbox/Code/dropdo/templates/text.html", line 8, in block "content"
{{ data|nl2br }}
File "/home/mcrittenden/Dropbox/Code/dropdo/dropdo.py", line 26, in nl2br
for p in _paragraph_re.split(escape(value)))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc9 in position 12: ordinal not in range(128)
What's the best to prevent the error but not remove the problem characters altogether?
Use unicode
literals everywhere.
"Unicode in Python, Completely Demystified"
这篇关于在Jinja的nl2br过滤器中避免Python UnicodeDecodeError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!