Flask JSON可序列化错误,因为Flask babel



我正在使用https://pythonhosted.org/Flask-Babel/本地化的扩展。

基本形式类

#!/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

我的表单类

#!/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"))])

我的观点

...
viewJsonData["error_list"] = form.error_list
return jsonify(**viewJsonData)

它抛出以下错误"TypeError:lu‘Post-content is required’is not JSON serializable"。

当我将本地化从_("Post Title")删除为"Post Title"时,它可以工作,但当我使用babel时,它不工作

我认为这是关于unicode的。因为我做了这个改变_("Post Title").encode("utf-8"),它就起作用了。但这种解决方案并不有效。我怎样才能解决这个问题。

问题是错误消息是lazy_gettext返回的_LazyString对象,而不是字符串。通常,这不会是一个问题,因为在模板中显示它会调用它的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

将davidism的解决方案更改为

return str(o.encode('UTF-8'))

转而使用Python 2。

相关内容

最新更新