2013-11-30 6 views
6

Я использовал django_openid_auth на моем проекте, и он работал довольно хорошо в течение некоторого времени. Но сегодня, я тестировал приложение и наткнулся на это исключение:django_openid_auth ТипError openid.yadis.manager.YadisServiceManager объект не JSON serializable

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 для своего сайта. может кто-нибудь посоветовать?

ответ

11

Это, кажется, известная ошибка: https://bugs.launchpad.net/django-openid-auth/+bug/1252826

Однако, как сейчас, не похоже, чтобы исправить.

Обходной, согласно this comment, является to reset the serializer:

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'

+0

Большой обходной путь. Похоронило это в течение 1 часа. n пробовать разные вещи, пока добавление сериализатора выше не заставило его работать. Thnx –

1

YEP! Я проверил! как я рассказывал, это было из-за новой версии django, Я переместился обратно на 1.5.5, и снова работает отлично!

Смежные вопросы