Как я могу обработать исключения, вызванные django-social-auth? - PullRequest
18 голосов
/ 24 июня 2011

В django-social-auth есть несколько случаев, когда бэкэнд поднимает ValueError (например, когда пользователь отменяет запрос на вход в систему или пользователь пытается связаться с учетной записью, которая уже была связана с другим пользователем) , Если пользователь столкнется с одним из этих сценариев, на вашем сайте ему будет сообщено об ошибке 500.

Итак, каков лучший способ поймать их? Я предпочел бы иметь возможность отображать полезное сообщение (через структуру сообщений), когда это происходит, но я не знаю, как лучше всего это сделать.

Я думаю о написании своего собственного представления (в отдельном приложении), которое просто оборачивает social_auth представление associate_complete, но это кажется неуклюжим ... какие-нибудь идеи?

Я мог бы раскошелиться django-social-auth и настроить это поведение, но я бы предпочел не поддерживать отдельный форк - тем более, что я не могу предположить, что кто-нибудь захочет обрабатывать эти исключения таким же образом.

Ответы [ 4 ]

19 голосов
/ 03 марта 2012

Довольно старый вопрос, но стоит упомянуть, что последняя версия DSA поддерживает пользовательский процессор исключений, где вы можете делать с сообщением об исключении все, что захотите.Версия по умолчанию сохраняет их в приложении сообщений.

Кроме того, теперь исключения различаются вместо ненужных ValueError.Проверьте документы http://django -social-auth.readthedocs.org / en / latest / configuration.html .

Обновление (13/08/2013):

С тех пор, как я опубликовал, все вышеперечисленное изменилось, теперь DSA имеет промежуточное ПО для исключений, которое при включении сохраняет сообщение об исключении в приложении встроенных сообщений jango.Желательно разделить промежуточное ПО на подклассы и добавить к нему пользовательское поведение.Проверьте документ по адресу http://django -social-auth.readthedocs.org / en / latest / configuration.html # exceptions-middleware

Пример промежуточного программного обеспечения:

# -*- coding: utf-8 -*-
from social_auth.middleware import SocialAuthExceptionMiddleware
from social_auth.exceptions import AuthFailed
from django.contrib import messages

class CustomSocialAuthExceptionMiddleware( SocialAuthExceptionMiddleware):

    def get_message(self, request, exception):
        msg = None
        if (isinstance(exception, AuthFailed) and 
            exception.message == u"User not allowed"):
            msg =   u"Not in whitelist" 
        else:
            msg =   u"Some other problem"    
        messages.add_message(request, messages.ERROR, msg)     
13 голосов
/ 24 августа 2011

Я столкнулся с той же проблемой, и кажется, что создание представления обертки - лучший способ справиться с этой ситуацией, на данный момент, по крайней мере. Вот как я это сделал:

def social_auth_login(request, backend):
    """
        This view is a wrapper to social_auths auth
        It is required, because social_auth just throws ValueError and gets user to 500 error
        after every unexpected action. This view handles exceptions in human friendly way.
        See https://convore.com/django-social-auth/best-way-to-handle-exceptions/
    """
    from social_auth.views import auth

    try:
        # if everything is ok, then original view gets returned, no problem
        return auth(request, backend)
    except ValueError, error:
        # in case of errors, let's show a special page that will explain what happened
        return render_to_response('users/login_error.html',
                                  locals(),
                                  context_instance=RequestContext(request))

Для этого вам нужно настроить url:

urlpatterns = patterns('',
    # ...
    url(r'^social_auth_login/([a-z]+)$',  social_auth_login, name='users-social-auth-login'), 
)

А затем используйте его как в шаблоне:

<a href="{% url 'users-social-auth-login' "google" %}">Log in with Google</a>

Надеюсь, это поможет, даже спустя два месяца после того, как был задан вопрос:)

6 голосов
/ 28 августа 2013

Вам необходимо добавить промежуточное ПО для социальной аутентификации:

MIDDLEWARE_CLASSES += ('social_auth.middleware.SocialAuthExceptionMiddleware',)

В случае возникновения ошибки пользователь будет перенаправлен на erorr url (LOGIN_ERROR_URL из настроек).

Для подробного объяснения смотрите документацию: http://django -social-auth.readthedocs.org / о / последний / configuration.html # исключения-промежуточный слой

5 голосов
/ 26 августа 2011

В views моего приложения .py:

from social_auth.views import associate_complete

def associate_complete_wrapper(request, backend):
    try:
        return associate_complete(request, backend)
    except ValueError, e:
        if e and len(e.args) > 0:
            messages.error(request, "Failed to Associate: %s" % e.args[0])
    return redirect(reverse('pieprofile-edit-account'))

Затем в корневом URL-адресе (обратите внимание на порядок этих шаблонов URL):

url(r'^associate/complete/(?P<backend>[^/]+)/$', 'myapp.views.associate_complete_wrapper'),
url(r'', include('social_auth.urls')),

Мой associate_complete_wrapper url по существу перехватываетsocial_auth's socialauth_associate_complete url.

...