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 :)
Necesita agregar middleware de autenticación social:
MIDDLEWARE_CLASSES += (''social_auth.middleware.SocialAuthExceptionMiddleware'',)
Si se produce algún error, el usuario será redirigido a erorr url (LOGIN_ERROR_URL desde la configuración).
Para una explicación detallada, consulte la documentación: http://django-social-auth.readthedocs.org/en/latest/configuration.html#exceptions-middleware
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)