我django_openid_auth
在我的项目中使用了一段时间它工作得很好.但是今天,我测试了应用程序并遇到了这个异常:
Environment: Request Method: GET Request URL: http://localhost:7777/google/login/ Django Version: 1.6 Python Version: 2.7.3 Installed Applications: ('django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.admin', 'meet', 'django_openid_auth', 'django_jenkins') Installed Middleware: ('django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.common.CommonMiddleware', 'meet.middlewares.TimezoneMiddleware') Traceback: File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 201. response = middleware_method(request, response) File "/usr/local/lib/python2.7/dist-packages/django/contrib/sessions/middleware.py" in process_response 38. request.session.save() File "/usr/local/lib/python2.7/dist-packages/django/contrib/sessions/backends/db.py" in save 57. session_data=self.encode(self._get_session(no_load=must_create)), File "/usr/local/lib/python2.7/dist-packages/django/contrib/sessions/backends/base.py" in encode 87. serialized = self.serializer().dumps(session_dict) File "/usr/local/lib/python2.7/dist-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 238. **kw).encode(obj) File "/usr/lib/python2.7/json/encoder.py" in encode 201. chunks = self.iterencode(o, _one_shot=True) File "/usr/lib/python2.7/json/encoder.py" in iterencode 264. return _iterencode(o, 0) File "/usr/lib/python2.7/json/encoder.py" in default 178. raise TypeError(repr(o) + " is not JSON serializable") Exception Type: TypeError at /google/login/ Exception Value:is not JSON serializable
我不确定我应该提供什么其他信息,但我确实在auth.py
这里:
from django.contrib.auth.models import User from openid.consumer.consumer import SUCCESS from django.core.mail import mail_admins class GoogleBackend: def authenticate(self, openid_response): if openid_response is None: return None if openid_response.status != SUCCESS: return None google_email = openid_response.getSigned('http://openid.net/srv/ax/1.0', 'value.email') google_firstname = openid_response.getSigned('http://openid.net/srv/ax/1.0', 'value.firstname') google_lastname = openid_response.getSigned('http://openid.net/srv/ax/1.0', 'value.lastname') try: #user = User.objects.get(username=google_email) # Make sure that the e-mail is unique. user = User.objects.get(email=google_email) if user.first_name == u'' : user.first_name = google_firstname if user.last_name == u'' : user.last_name = google_lastname except User.DoesNotExist: user = User.objects.create_user(google_email, google_email, 'password') user.first_name = google_firstname user.last_name = google_lastname user.save() user = User.objects.get(username=google_email) return user return user def get_user(self, user_id): try: return User.objects.get(pk=user_id) except User.DoesNotExist: return None
并且还urls.py
包含以下两行:
url(r'^google/login/$', 'django_openid_auth.views.login_begin', name='openid-login'), url(r'^google/login-complete/$', 'django_openid_auth.views.login_complete', name='openid-complete'),
然后,根据请求登录,异常弹出.如果这有帮助,唯一改变的是我开始在我的网站上使用django 1.6.有人可以建议吗?
这似乎是一个已知的错误:https://bugs.launchpad.net/django-openid-auth/+bug/1252826
但是,截至目前,似乎没有解决方案.
根据此评论,解决方法是重置序列化程序:
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'