2014-09-30 34 views
8

Yerelleştirme için https://pythonhosted.org/Flask-Babel/ uzantısını kullanıyorum. Flask JSON serileştirilebilir hata nedeniyle flask babil

baz formu sınıfı

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

benim form sınıf

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

Bu hatayı atar

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

benim görünümü "TypeError: lu'Post içeriği 'gereklidir değil JSON serilestirilebilir".

i "Yazı Başlığı" işe _ ("Post Title") elde yerelleştirme kaldırdığınızda ama Babel kullandığınızda o

Ben unicode hakkında olduğunu düşünüyorum çalışmaz. çünkü bu değişikliği yaptım _ ("Post Title") kodlar ("utf-8") çalışır. Ancak bu çözüm etkili değildir. Sorunu nasıl çözebilirim.

cevap

11

Sorun, hata iletinizin bir dize değil, lazy_gettext tarafından döndürülen bir _LazyString nesnesi olmasıdır. Normalde, bu bir sorun olmaz çünkü bir şablonda görüntülemek, çeviriyi değerlendirmek için str()'u çağırır. Ancak, nesneyi error_list içinde toplayıp jsonify'a iletiyorsunuz ve json bu nesneler için bir serileştiriciye sahip değil.

Flask'in JSON seri hale getiricisine bu nesnelerin nasıl ele alınacağını söylemeniz gerekir. Özel bir seri hale getirici yazıp app.json_encoder'a atayın.

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

için

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 
0

Değişim davidism çözümü yerine Python 2 üzerinde çalışmak için.

+0

Bu, bir dizi nedenden dolayı yanlıştır. Her zaman metin döndürmelisiniz ('Pyr'de str', Py2’de unicode’dur). Kesinlikle metni kodlama/kod çözme, sadece Py2 için 'unicode' çağırma. Cevabımda düzenlediğim Flask'un uyumluluk modülünü her ikisiyle de uyumlu olacak şekilde kullanın. – davidism