django_openid_auth TypeError openid.yadis.manager.YadisServiceManager объект не является сериализуемым JSON
Я использовал 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: <openid.yadis.manager.YadisServiceManager object at 0x7fd2f43b2250> 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 для своего сайта. кто-нибудь может посоветовать?
2 ответа
Кажется, это известная ошибка: https://bugs.launchpad.net/django-openid-auth/+bug/1252826
Тем не менее, на данный момент, похоже, нет решения.
Обходной путь, согласно этому комментарию, должен сбросить сериализатор:
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
АГА! Я проверил! как я уже говорил, из-за новой версии django я перешел на 1.5.5
и снова все работает отлично!