import logging from django.shortcuts import render from django.utils.deprecation import MiddlewareMixin from social_core.exceptions import SocialAuthBaseException, AuthAlreadyAssociated from .exceptions import AuthUserUnregisteredError logger = logging.getLogger(__name__) class SocialAuthExceptionMiddleware(MiddlewareMixin): def process_exception(self, request, exception): if isinstance(exception, SocialAuthBaseException): if isinstance(exception, AuthUserUnregisteredError): backend = getattr(request, 'backend', None) backend_name = getattr(backend, 'name', 'unknown-backend') return render( request, 'social_auth/unregistered.html', {'backend_name': backend_name}, status=401 ) elif isinstance(exception, AuthAlreadyAssociated): return render( request, 'social_auth/login_error.html', {'error_detail': '该账号已被其他用户绑定'}, status=400 ) else: logger.warning(exception) return render( request, 'social_auth/login_error.html', {'error_detail': '登录失败, 我们已记录该问题, 请稍后再试'}, status=400 )