烧瓶JSON可序列化错误,因为烧瓶巴贝尔

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)