【问题标题】:Flask JSON serializable error because of flask babel由于烧瓶 babel 导致烧瓶 JSON 可序列化错误
【发布时间】:2014-11-25 07:16:11
【问题描述】:

我正在使用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") 它有效。但是这个解决方案是无效的。我该如何解决这个问题。

【问题讨论】:

    标签: python json unicode flask


    【解决方案1】:

    问题是您的错误消息是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
    

    【讨论】:

      【解决方案2】:

      将大卫主义的解决方案改为

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

      改为使用 Python 2。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-31
        • 2021-04-29
        • 2013-08-19
        相关资源
        最近更新 更多