Ale*_*der 8 python unicode json flask
我使用https://pythonhosted.org/Flask-Babel/extention进行本地化.
基础形式类
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from app import app
from flask.ext.wtf import Form
class BaseForm(Form):
@property
def error_list(self):
_errors = []
for fieldName, errorMessages in self.errors.iteritems():
for err in errorMessages:
_errors.append(err)
return _errors
Run Code Online (Sandbox Code Playgroud)
我的表格课
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import g
from wtforms import StringField, TextField, PasswordField # BooleanField
import wtforms.validators as validators
from flask.ext.babel import lazy_gettext as _
from flask.ext.babel import npgettext as _n
from app.base_forms import *
class PostForm(BaseForm):
post_title = StringField(_("Post Title"), [validators.Required(message=_("Post title is required")) ])
post_content = StringField(_("Post Content"), [ validators.Required(message=_("Post content is required"))])
Run Code Online (Sandbox Code Playgroud)
我的看法
...
viewJsonData["error_list"] = form.error_list
return jsonify(**viewJsonData)
Run Code Online (Sandbox Code Playgroud)
它抛出此错误"TypeError:lu'Post content is required'不是JSON可序列化的".
当我从_("帖子标题")到"帖子标题"删除本地化它工作,但当我使用babel它不起作用
我认为这是关于unicode.因为我做了这个改变_("帖子标题").编码("utf-8")它的工作原理.但这种解决方案无效.我该如何解决这个问题.
dav*_*ism 12
问题是您的错误消息是由_LazyString返回的对象lazy_gettext,而不是字符串.通常,这不是问题,因为在模板中显示它会调用str()它,导致它评估翻译.但是,您正在收集对象error_list,然后将它们传递给jsonify,并且json没有这些对象的序列化程序.
您需要告诉Flask的JSON序列化程序如何处理这些对象.编写自定义序列化程序然后将其分配给app.json_encoder.
from flask._compat import text_type
from flask.json import JSONEncoder as BaseEncoder
from speaklater import _LazyString
class JSONEncoder(BaseEncoder):
def default(self, o):
if isinstance(o, _LazyString):
return text_type(o)
return BaseEncoder.default(self, o)
app.json_encoder = JSONEncoder
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2304 次 |
| 最近记录: |