python - authenticate - login required django
¿Cómo se requiere iniciar sesión para Django Generic Views? (8)
Django 1.9 o usando django-llaves
Django 1.9 ha introducido un LoginRequiredMixin que se usa así:
from django.contrib.auth.mixins import LoginRequiredMixin
class MyView(LoginRequiredMixin, View):
login_url = ''/login/''
redirect_field_name = ''redirect_to''
Si está utilizando una versión anterior de django, puede usar prácticamente la misma mezcla de django-braces : la versión de Django se basó en la versión django-llaves. django-braces 1.4.x aún es compatible con Django 1.4, por lo que puedes usarlo con versiones bastante antiguas.
Métodos antiguos
Encontré esta pregunta mientras busqué en Google cómo decorar vistas basadas en clases, para agregar la respuesta para eso:
Esto se trata en la sección de documentación sobre decoración de vistas basadas en clases . Existe el contenedor urls.py
, o puede aplicar el decorador al método dispatch()
. Ejemplos de la documentación:
Decorar en URL conf
from django.contrib.auth.decorators import login_required, permission_required
from django.views.generic import TemplateView
from .views import VoteView
urlpatterns = patterns('''',
(r''^about/'', login_required(TemplateView.as_view(template_name="secret.html"))),
(r''^vote/'', permission_required(''polls.can_vote'')(VoteView.as_view())),
)
Decorando la clase
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView
class ProtectedView(TemplateView):
template_name = ''secret.html''
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(ProtectedView, self).dispatch(*args, **kwargs)
Consulte la documentación vinculada a arriba para más detalles.
Quiero restringir el acceso a las URL manejadas por Django Generic Views.
Para mis Vistas, sé que el decorador de login_required
hace el trabajo. También crear / eliminar / actualizar vistas genéricas toma el argumento login_required
, pero no pude encontrar una manera de hacer esto para otras vistas genéricas.
Las vistas genéricas han cambiado de funciones a objetos con la versión 1.3 de Django. Como tal, se necesita un ligero cambio para que las respuestas de Will McCutchen y Will Hardy funcionen con la versión 1.3:
from django.contrib.auth.decorators import login_required
from django.views.generic import TemplateView
urlpatterns = patterns('''',
(r''^foo/$'', login_required(TemplateView.as_view(template_name=''foo_index.html''))),
)
También la documentation describe cómo hacer esto también.
Otra forma de lograr esto es a continuación, me gusta que sea bastante similar a cómo se hace con las vistas basadas en funciones y no requiere modificar urls.py
dispatch
:
@method_decorator(login_required, name=''dispatch'')
class YourGenericViewSubclass(TemplateView):
#
# View methods
#
Para Django <1.5, puede agregar un decorador envolviendo la función en sus URL, lo que le permite ajustar las vistas genéricas:
from django.contrib.auth.decorators import login_required
from django.views.generic.simple import direct_to_template
urlpatterns = patterns('''',
(r''^foo/$'', login_required(direct_to_template), {''template'': ''foo_index.html''}),
)
Las vistas genéricas basadas en función están en desuso en Django 1.4 y se eliminaron en Django 1.5. Pero se aplica el mismo principio, simplemente ajuste la función view de la vista basada en clase con el decorador login_required
:
login_required(TemplateView.as_view(template_name=''foo_index.html''))
Para django 1.11, puede usar LoginRequiredMixin para vistas basadas en clase
en el archivo de configuración debe agregar
LOGIN_URL="/login/"
en tu views.py
from django.contrib.auth.mixins import LoginRequiredMixin
class RestaurantLocationCreateView(LoginRequiredMixin,CreateView):
....
Quería una forma reutilizable de requerir autenticación en muchas vistas derivadas de vistas genéricas. Creé una función de envío de reemplazo que puedo agregar a mi clase de vista de la misma manera que en otras declaraciones.
class Index(generic.ListView):
model = models.HomePage
dispatch = auth.dispatch
auth.dispatch es donde hacemos el trabajo:
def dispatch(self, request, *args, **kw):
"""Mix-in for generic views"""
if userSession(request):
return super(self.__class__, self).dispatch(request, *args, **kw)
# auth failed, return login screen
response = user(request)
response.set_cookie(''afterauth'', value=request.path_info)
return response
Si no desea escribir su propia capa delgada alrededor de las vistas genéricas en cuestión (como sugirió Aamir), también puede hacer algo como esto en su archivo urls.py
:
from django.conf.urls.defaults import *
# Directly import whatever generic views you''re using and the login_required
# decorator
from django.views.generic.simple import direct_to_template
from django.contrib.auth.decorators import login_required
# In your urlpatterns, wrap the generic view with the decorator
urlpatterns = patterns('''',
(r'''', login_required(direct_to_template), {''template'': ''index.html''}),
# etc
)
Use lo siguiente:
from django.contrib.auth.decorators import login_required
@login_required
def your_view():
# your code here