我有一个django应用程序,该应用程序在1.4.2版本上运行且工作正常,但是最近我将其更新为django,1.6.5并遇到了一些如下所示的错误
1.4.2
1.6.5
实际上,我是在用户/客户端注册过程中通过网站功能获取此信息的
Request URL: http://example.com/client/registration/ Django Version: 1.6.5 Exception Type: TypeError Exception Value: <Client: test one> is not JSON serializable Exception Location: /usr/lib/python2.7/json/encoder.py in default, line 184 Python Executable: /home/user/.virtualenvs/test_proj/bin/python Python Version: 2.7.5
追溯
Traceback: File "/home/user/.virtualenvs/test_proj/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 199. response = middleware_method(request, response) File "/home/user/.virtualenvs/test_proj/local/lib/python2.7/site-packages/django/contrib/sessions/middleware.py" in process_response 38. request.session.save() File "/home/user/.virtualenvs/test_proj/local/lib/python2.7/site-packages/django/contrib/sessions/backends/db.py" in save 57. session_data=self.encode(self._get_session(no_load=must_create)), File "/home/user/.virtualenvs/test_proj/local/lib/python2.7/site-packages/django/contrib/sessions/backends/base.py" in encode 87. serialized = self.serializer().dumps(session_dict) File "/home/user/.virtualenvs/test_proj/local/lib/python2.7/site-packages/django/core/signing.py" in dumps 88. return json.dumps(obj, separators=(',', ':')).encode('latin-1') File "/usr/lib/python2.7/json/__init__.py" in dumps 250. sort_keys=sort_keys, **kw).encode(obj) File "/usr/lib/python2.7/json/encoder.py" in encode 207. chunks = self.iterencode(o, _one_shot=True) File "/usr/lib/python2.7/json/encoder.py" in iterencode 270. return _iterencode(o, 0) File "/usr/lib/python2.7/json/encoder.py" in default 184. raise TypeError(repr(o) + " is not JSON serializable") Exception Type: TypeError at /client/registration/ Exception Value: <Client: test one> is not JSON serializable
我对为什么更新后出现上述json错误感到困惑,顺便说一句,我在下面的某些模型中使用自定义的json字段
proj / utils.py
from django.db import models from django.utils import simplejson as json from django.core.serializers.json import DjangoJSONEncoder class JSONField(models.TextField): '''JSONField is a generic textfield that neatly serializes/unserializes JSON objects seamlessly''' # Used so to_python() is called __metaclass__ = models.SubfieldBase def to_python(self, value): '''Convert our string value to JSON after we load it from the DB''' if value == '': return None try: if isinstance(value, basestring): return json.loads(value) except ValueError: pass return value def get_db_prep_save(self, value, connection=None): '''Convert our JSON object to a string before we save''' if not value or value == '': return None if isinstance(value, (dict, list)): value = json.dumps(value, mimetype="application/json") return super(JSONField, self).get_db_prep_save(value, connection=connection) from south.modelsinspector import add_introspection_rules add_introspection_rules([], ["^proj\.util\.jsonfield\.JSONField"])
settings.py
SERIALIZATION_MODULES = { 'custom_json': 'proj.util.json_serializer', }
json_serializer.py
from django.core.serializers.json import Serializer as JSONSerializer from django.utils.encoding import is_protected_type # JSONFields that are normally incorrectly serialized as strings json_fields = ['field_1', 'field_2'] class Serializer(JSONSerializer): """ A fix on JSONSerializer in order to prevent stringifying JSONField data. """ def handle_field(self, obj, field): value = field._get_val_from_obj(obj) # Protected types (i.e., primitives like None, numbers, dates, # and Decimals) are passed through as is. All other values are # converted to string first. if is_protected_type(value) or field.name in json_fields: self._current[field.name] = value else: self._current[field.name] = field.value_to_string(obj)
那么如何解决以上错误呢?有人可以给我解释一下导致错误的原因吗?
Django 1.6将序列化程序从pickle更改为json。pickle可以序列化json不能的东西。
你可以改变的价值SESSION_SERIALIZER在settings.py1.6版本之前取回从Django的行为。
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
您可能想在文档中阅读有关会话序列化的信息。