social_django google example auth app django authentication social django-socialauth

google - twitter login django



¿Cómo puedo manejar las excepciones generadas por django-social-auth? (4)

En django-social-auth , hay algunas instancias en las que un backend generará un ValueError (como cuando un usuario cancela una solicitud de inicio de sesión o si un usuario intenta asociarse con una cuenta que ya ha sido asociada con otro usuario). Si un usuario se encuentra en uno de estos escenarios, se le presentará un error 500 en su sitio.

Entonces, ¿cuál es la mejor manera de atrapar estos? Preferiría poder mostrar un mensaje útil (a través del marco de mensajes) cuando esto sucede, pero no sé cuál es la mejor manera de hacerlo.

Estoy pensando en escribir mi propia vista (en una aplicación separada) que simplemente envuelva la vista associate_complete social_auth , pero esto parece torpe ... ¿alguna idea?

Podría bifurcar django-social-auth y personalizar este comportamiento, pero preferiría no mantener un bifurcación por separado, especialmente porque no puedo asumir que alguien quiera manejar estas Excepciones de la misma manera.


En el view.py de mi aplicación:

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''))

Luego, en el URLconf de raíz (observe el orden de estos patrones de url):

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

Mi URL associate_complete_wrapper secuestra esencialmente socialauth_associate_complete socialauth_associate_complete .


He encontrado el mismo problema y parece que crear una vista envolvente es la mejor manera de manejar esta situación, en este punto, al menos. Así es como me hice el mío:

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))

Tendrás que configurar url para ello:

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

Y luego usarlo como antes en la plantilla:

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

Espero que esto ayude, incluso después de dos meses después de la pregunta :)



Pregunta bastante antigua, pero vale la pena mencionar que la versión reciente de DSA admite un procesador de excepciones personalizado donde puede hacer lo que quiera con el mensaje de excepción. La versión predeterminada los almacena en la aplicación de mensajes.

Además, las excepciones se diferencian ahora en lugar del ValueError no útil utilizado. Compruebe los documentos http://django-social-auth.readthedocs.org/en/latest/configuration.html .

Actualización (13/08/2013):

Desde que publiqué lo anterior, las cosas han cambiado, ahora DSA tiene un middleware de excepción que, cuando se habilita, almacena el mensaje de excepción en la aplicación de mensajes integrados de jango. Es preferible subclasificar el middleware y agregarle el comportamiento personalizado. Consulte el documento en http://django-social-auth.readthedocs.org/en/latest/configuration.html#exceptions-middleware

Muestra de 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)