2010-08-11 4 views
7

Dans mon application Django, j'ai certaines permissions dont les utilisateurs ont besoin pour accéder à certaines vues (en utilisant django.contrib.auth). Cela fonctionne bien, en utilisant le décorateur @permission_required sur mes fonctions d'affichage.Django: Application des autorisations dans le répartiteur d'URL?

Cependant, certains de mes URL résoudre à des vues que je n'ai pas écrit, comme le haut-django.contrib.auth.views.password_change, comme dans les domaines suivants urls.py:

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

Dans ce cas, je n'ai nulle part appliquer mon @permission_required décorateur - ou est-ce que je le fais? Est-il possible d'appliquer une restriction d'autorisations au niveau du répartiteur d'URL?

Répondre

8

Il est possible d'importer la fonction de connexion nécessaire et l'appliquer à la vue générique:

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

comme mention here.

+0

Comment utiliseriez-vous 'permission_required' de la même manière? Plus précisément, comment passeriez-vous l'argument du nom d'autorisation? –

+0

@Manoj: consultez cette section de la documentation: http://docs.djangoproject.com/fr/dev/topics/auth/#limiting-access-to-generic-views l'idée est d'écrire une enveloppe fine (avec permission_required decorator) autour de la vue générique, et pointez votre urlconf sur cette enveloppe ... – Hoff

+0

C'est ce que j'ai fait dans ma réponse. Je voulais juste savoir s'il y avait un autre moyen de s'y prendre. Merci. –

-1

Une approche consisterait à envelopper les vues que vous n'avez pas écrites.

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

J'ai un little hack sur le résolveur URL Django, vous pouvez demander un décorateur au niveau d'expédition 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 décorateur est un mot de fantaisie pour une fonction qui enveloppe une autre fonction. login_required est une fonction wrapper pour une vue tandis que permission_required construit un wrapper pour votre vue. En d'autres termes, login_required est lui-même un décorateur et permission_required(perm) construit un décorateur.

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

vous êtes le meilleur! Cette réponse est plus intelligible l'élu –

Questions connexes