Tengo algunos problemas para entender cómo funcionan los nuevos CBV. Mi pregunta es esta, necesito solicitar el inicio de sesión en todas las vistas, y en algunas de ellas, permisos específicos. En las vistas basadas en funciones, hago eso con @permission_required () y el atributo login_required en la vista, pero no sé cómo hacer esto en las nuevas vistas. ¿Hay alguna sección en los documentos de django que explique esto? No encontré nada. ¿Qué esta mal en mi codigo?
Traté de usar el @method_decorator pero responde " TypeError at / spaces / prueba / _wrapped_view () toma al menos 1 argumento (0 dado) "
Aquí está el código (GPL):
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required, permission_required
class ViewSpaceIndex(DetailView):
"""
Show the index page of a space. Get various extra contexts to get the
information for that space.
The get_object method searches in the user 'spaces' field if the current
space is allowed, if not, he is redirected to a 'nor allowed' page.
"""
context_object_name = 'get_place'
template_name = 'spaces/space_index.html'
@method_decorator(login_required)
def get_object(self):
space_name = self.kwargs['space_name']
for i in self.request.user.profile.spaces.all():
if i.url == space_name:
return get_object_or_404(Space, url = space_name)
self.template_name = 'not_allowed.html'
return get_object_or_404(Space, url = space_name)
# Get extra context data
def get_context_data(self, **kwargs):
context = super(ViewSpaceIndex, self).get_context_data(**kwargs)
place = get_object_or_404(Space, url=self.kwargs['space_name'])
context['entities'] = Entity.objects.filter(space=place.id)
context['documents'] = Document.objects.filter(space=place.id)
context['proposals'] = Proposal.objects.filter(space=place.id).order_by('-pub_date')
context['publication'] = Post.objects.filter(post_space=place.id).order_by('-post_pubdate')
return context
message
?Aquí está mi enfoque, creo un mixin que está protegido (esto se mantiene en mi biblioteca mixin):
Siempre que desee que se proteja una vista, simplemente agregue el mixin apropiado:
Solo asegúrate de que tu mezcla sea la primera.
Actualización: publiqué esto en 2011, comenzando con la versión 1.9. Django ahora incluye este y otros mixins útiles (AccessMixin, PermissionRequiredMixin, UserPassesTestMixin) como estándar.
fuente
Aquí hay una alternativa usando decoradores basados en clases:
Esto se puede usar simplemente así:
fuente
class_view_decorator(my_decorator(*args, **kwargs))
. En cuanto a la coincidencia de método condicional, puede modificar el class_view_decorator para aplicarloView.get
o enView.post
lugar de hacerloView.dispatch
.Me doy cuenta de que este hilo está un poco anticuado, pero de todos modos aquí están mis dos centavos.
con el siguiente código:
ahora tenemos una forma de parchear un decorador, por lo que será multifuncional. Esto significa efectivamente que cuando se aplica a un decorador de vista normal, así:
este decorador seguirá funcionando cuando se use de la manera original:
pero también funcionará correctamente cuando se usa así:
Esto parece funcionar bien en varios casos que he encontrado recientemente, incluido este ejemplo del mundo real:
La función ajax_view se escribe para modificar una vista (basada en la función), de modo que genera un error 404 cada vez que una llamada no ajax visita esta vista. Simplemente aplicando la función de parche como decorador, este decorador está configurado para funcionar también en vistas basadas en clase
fuente
Para aquellos de ustedes que usan Django> = 1.9 , ya está incluido en
django.contrib.auth.mixins
comoAccessMixin
,LoginRequiredMixin
,PermissionRequiredMixin
yUserPassesTestMixin
.Entonces, para aplicar LoginRequired a CBV (por ejemplo
DetailView
):También es bueno tener en cuenta el orden GCBV Mixin: los mixins deben ir del lado izquierdo y la clase de vista base debe ir del lado derecho . Si el orden es diferente, puede obtener resultados rotos e impredecibles.
fuente
Usa llaves Django. Proporciona muchos mixins útiles que están fácilmente disponibles. Tiene hermosos documentos. Pruébalo.
Incluso puedes crear tus mixins personalizados.
http://django-braces.readthedocs.org/en/v1.4.0/
Código de ejemplo:
fuente
Si es un sitio donde la mayoría de las páginas requieren que el usuario inicie sesión, puede usar un middleware para forzar el inicio de sesión en todas las vistas, excepto en algunas que están especialmente marcadas.
Pre Django 1.10 middleware.py:
views.py:
Las vistas de terceros que no desea ajustar pueden sobresalir en la configuración:
settings.py:
fuente
En mi código, he escrito este adaptador para adaptar funciones miembro a una función no miembro:
Simplemente puede usarlo así:
fuente
method_decorator
está). Parece una forma agradable y legible de lograr esto.Esto es súper fácil con django> 1.9 que viene con soporte para
PermissionRequiredMixin
yLoginRequiredMixin
Solo importa desde la autenticación
views.py
Para más detalles lea Autorización en django
fuente
Ha pasado un tiempo y ahora Django ha cambiado mucho.
Consulte aquí cómo decorar una vista basada en clases.
https://docs.djangoproject.com/en/2.2/topics/class-based-views/intro/#decorating-the-class
La documentación no incluía un ejemplo de "decoradores que toman cualquier argumento". Pero los decoradores que toman argumentos son así:
así que si vamos a usar mydec como decorador "normal" sin argumentos, podemos hacer esto:
De manera similar, para usar
permission_required
conmethod_decorator
podemos hacer:
fuente
Si está realizando un proyecto que requiere una variedad de pruebas de permisos, puede heredar esta clase.
fuente
He hecho esa solución basada en la solución de Josh
Uso de la muestra:
fuente
Aquí la solución para el decorador de permiso requerido:
fuente