在Jinja的nl2br过滤器中避免Python UnicodeDecodeError [英] Avoiding Python UnicodeDecodeError in Jinja's nl2br filter

查看:201
本文介绍了在Jinja的nl2br过滤器中避免Python UnicodeDecodeError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 从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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆