исключение python-social-authcanceled
Я использую python-social-auth в моем приложении Django для аутентификации через Facebook. Но когда пользователь пытается войти в систему и когда он был перенаправлен на страницу приложения Facebook, нажимает кнопку" Отмена", появляется следующее исключение:
ERROR 2014-01-03 15:32:15,308 base :: Internal Server Error: /complete/facebook/
Traceback (most recent call last):
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 57, in wrapped_view
return view_func(*args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/apps/django_app/utils.py", line 45, in wrapper
return func(request, backend, *args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/apps/django_app/views.py", line 21, in complete
redirect_name=REDIRECT_FIELD_NAME, *args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/actions.py", line 54, in do_complete
*args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/strategies/base.py", line 62, in complete
return self.backend.auth_complete(*args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/backends/facebook.py", line 63, in auth_complete
self.process_error(self.data)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/backends/facebook.py", line 56, in process_error
super(FacebookOAuth2, self).process_error(data)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/backends/oauth.py", line 312, in process_error
raise AuthCanceled(self, data.get('error_description', ''))
AuthCanceled: Authentication process canceled
есть ли способ поймать его Django?
7 ответов
вы можете создать промежуточное ПО и поймать любые исключения, список исключений: https://github.com/omab/python-social-auth/blob/master/social/exceptions.py в этом случае ваше исключение AuthCanceled.
middleware.py
from social.apps.django_app.middleware import SocialAuthExceptionMiddleware
from django.shortcuts import HttpResponse
from social import exceptions as social_exceptions
class SocialAuthExceptionMiddleware(SocialAuthExceptionMiddleware):
def process_exception(self, request, exception):
if hasattr(social_exceptions, 'AuthCanceled'):
return HttpResponse("I'm the Pony %s" % exception)
else:
raise exception
settings.py
MIDDLEWARE_CLASSES = (
.....
'pat_to_middleware.SocialAuthExceptionMiddleware',
)
python-social-auth
является более новой, производной версией django-social-auth
.
AlexYar это ответ может быть слегка изменен для работы с python-social-auth
по modify settings.py
следующие изменения:
-
добавить промежуточное ПО для обработки SocialAuthException
MIDDLEWARE_CLASSES += ( 'social.apps.django_app.middleware.SocialAuthExceptionMiddleware', )
-
URL для перенаправления, когда произошло исключение
SOCIAL_AUTH_LOGIN_ERROR_URL = '/'
-
обратите внимание, что вы должны set
DEBUG = False
это все или читать http://python-social-auth.readthedocs.org/en/latest/configuration/django.html#exceptions-middleware
это небольшая модификация ответа @Nicolas, и это работает для меня.
middleware.py
from social.apps.django_app.middleware import SocialAuthExceptionMiddleware
from django.shortcuts import render
from social.exceptions import AuthCanceled
class SocialAuthExceptionMiddleware(SocialAuthExceptionMiddleware):
def process_exception(self, request, exception):
if type(exception) == AuthCanceled:
return render(request, "pysocial/authcancelled.html", {})
else:
pass
settings.py
MIDDLEWARE_CLASSES += (
'myapp.middleware.SocialAuthExceptionMiddleware',
)
просто добавить в
MIDDLEWARE_CLASSES = ( 'social_auth.промежуточное программное обеспечение.SocialAuthExceptionMiddleware', )
и что-то вроде
LOGIN_ERROR_URL ='/'
Это все или читать http://django-social-auth.readthedocs.org/en/latest/configuration.html#exceptions-middleware
ответ 2018:
-
добавить
SocialAuthExceptionMiddleware
промежуточное ПО для вашей конфигурации:MIDDLEWARE_CLASSES = [ ... 'social_django.middleware.SocialAuthExceptionMiddleware', ]
-
Set
SOCIAL_AUTH_LOGIN_ERROR_URL
в свой config:SOCIAL_AUTH_LOGIN_ERROR_URL = '/login'
теперь, когда у вас есть DEBUG = False
, ваши пользователи будут перенаправлены на страницу входа в систему, когда они нажмут отмена на странице поставщика социальной аутентификации.
, когда DEBUG = True
вы увидите страницу ошибки в браузере в процессе разработки.
Если вы не заботитесь об обработке исключения, сделайте следующее в своем settings.py
SOCIAL_AUTH_RAISE_EXCEPTIONS = False
посмотреть этот ответ: как решить процесс аутентификации отменена ошибка?
это обновленное промежуточное ПО импорта с помощью social_django
from social_django.middleware import SocialAuthExceptionMiddleware
from social_core import exceptions as social_exceptions
from django.shortcuts import HttpResponse
from django.shortcuts import render, redirect
class FacebookAuthCanceledExceptionMiddleware(SocialAuthExceptionMiddleware):
def process_exception(self, request, exception):
if hasattr(social_exceptions, 'AuthCanceled'):
return redirect('auth_login')
else:
raise exception