Django, "не является сериализуемым JSON" при использовании ugettext_lazy?

У меня это в моем views.py

response_dict = {
    'status': status,
    'message': message
}
return HttpResponse(simplejson.dumps(response_dict),
                    mimetype='application/javascript')

Так как я начинаю использовать этот импорт:

from django.utils.translation import ugettext_lazy as _

в этой строке:

message = _('This is a test message')

Я получаю эту ошибку:

 File "/home/chris/work/project/prokject/main/views.py", line 830, in fooFunc
    return HttpResponse(simplejson.dumps(response_dict),

  File "/usr/local/lib/python2.7/json/__init__.py", line 243, in dumps
    return _default_encoder.encode(obj)

  File "/usr/local/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)

  File "/usr/local/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)

  File "/usr/local/lib/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")

TypeError: <django.utils.functional.__proxy__ object at 0x7f42d581b590> is not JSON serializable

Почему? Что я делаю неправильно?

Ответ 1

Это еще не строка, а кодер Python JSON не знает об ugettext_lazy, поэтому вам придется заставить его стать строкой с чем-то вроде

response_dict = {
    'status': status,
    'message': unicode(message)
}

Ответ 2

Вы также можете создать собственный JSON-кодер, который заставит __proxy__ на unicode.

Из https://docs.djangoproject.com/en/1.8/topics/serialization/

from django.utils.functional import Promise
from django.utils.encoding import force_text
from django.core.serializers.json import DjangoJSONEncoder

class LazyEncoder(DjangoJSONEncoder):
    def default(self, obj):
        if isinstance(obj, Promise):
            return force_text(obj)
        return super(LazyEncoder, self).default(obj)

Итак, теперь ваш код может выглядеть так:

response_dict = {
    'status': status,
    'message': _('Your message')
}

return HttpResponse(json.dumps(response_dict, cls=LazyEncoder),
                    mimetype='application/javascript')