我在我的Django应用程序中使用python-social-auth通过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?
python-social-auth
是一个较新的派生版本django-social-auth
.
可以稍微修改AlexYar的答案,python-social-auth
通过settings.py
以下更改进行修改:
添加中间件来处理SocialAuthException
MIDDLEWARE_CLASSES += ( 'social.apps.django_app.middleware.SocialAuthExceptionMiddleware', )
发生异常时要重定向到的URL
SOCIAL_AUTH_LOGIN_ERROR_URL = '/'
请注意,您还需要设置
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', )
您可以创建一个中间件并捕获任何异常,例外列表:https://github.com/omab/python-social-auth/blob/master/social/exceptions.py 在这种情况下您的AuthCanceled Exception.
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',
)