based authenticate python django

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