gpt4 book ai didi

python - Flask JSON 序列化错误,因为 flask babel

转载 作者:太空狗 更新时间:2023-10-29 20:49:45 25 4
gpt4 key购买 nike

我正在使用 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

关于python - Flask JSON 序列化错误,因为 flask babel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26124581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com