2010-08-11 9 views
7

En mi aplicación Django, tengo ciertos permisos que los usuarios necesitan para acceder a ciertas vistas (usando django.contrib.auth). Esto funciona bien, usando el decorador @permission_required en las funciones de mi vista.Django: ¿Aplicar permisos en el despachador de URL?

Sin embargo, algunos de mis URL resolver a puntos de vista que no he escrito, como la incorporada en django.contrib.auth.views.password_change, como en el siguiente urls.py:

urlpatterns = patterns(
(r'^$', "users.views.index"), 
(r'^password_change/$', 'django.contrib.auth.views.password_change')) 

En este caso, no tengo dónde aplicar mi @permission_required decorador - ¿o no? ¿Hay alguna forma de aplicar una restricción de permisos en el nivel de despachador de URL?

Respuesta

8

Es posible importar la función de inicio de sesión requerida y aplicarlo a la vista genérica:

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

como mención here.

+0

¿Cómo usarías 'permission_required' de la misma manera? Específicamente, ¿cómo le pasarías el argumento del nombre del permiso? –

+0

@Manoj: echa un vistazo a esta sección de la documentación: http://docs.djangoproject.com/en/dev/topics/auth/#limiting-access-to-generic-views la idea es escribir un envoltorio delgado (con permission_required decorator) alrededor de la vista genérica, y apunte su urlconf a ese contenedor ... – Hoff

+0

Eso es lo que hice en mi respuesta. Solo quería saber si había otra forma de hacerlo. Gracias. –

-1

Un enfoque sería envolver las vistas que no escribió.

from django.contrib.auth.views import password_change 

@permission_required('my_perm') 
def wrapper(*args, **kwargs): 
    return password_change(*args, **kwargs) 

#URLs 
urlpatterns = patterns(
    (r'^$', "users.views.index"), 
    (r'^password_change/$', 'wrapper')) 
-1

Tengo un little hack acerca de la URL de resolución de Django, es posible aplicar un decorador a nivel de despacho URL:

from django_url_decr import url_decr 
from django.contrib.auth.decorators import login_required 

urlpatterns = patterns('' 
         url_decr(r'^users/', 
           include('users.urls'), 
           decr=login_required)) 
5

Un decorador es una palabra elegante para una función que envuelve otra función. login_required es una función de contenedor para una vista, mientras que permission_required construye un contenedor para su vista. En otras palabras, login_required es en sí mismo un decorador y permission_required(perm) construye un decorador.

from django.conf.urls import url 
from django.contrib.auth.decorators import login_required, permission_required 

urlpatterns = [ 
    url(r'^public/', myview), 

    url(r'^users_only/', 
     login_required(myview)), 

    url(r'^users_with_perms/', 
     permission_required('myapp.view_mymodel', login_url='login')(myview)), 

    url(r'^login_page/', myloginview, name='login'), 
] 
+0

¡eres el mejor! Esta respuesta es más inteligible que la elegida –

Cuestiones relacionadas