2010-08-11 11 views
7

Nella mia applicazione Django, ho alcune autorizzazioni di cui gli utenti hanno bisogno per accedere ad alcune viste (usando django.contrib.auth). Funziona bene, usando il decoratore @permission_required sulle funzioni di visualizzazione.Django: si applicano le autorizzazioni nel dispatcher URL?

Tuttavia, alcuni dei miei URL volontà di vedute che non ho scritto, come il built-in django.contrib.auth.views.password_change, come nel seguente urls.py:

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

In questo caso, ho un posto di applicare la mia @permission_required decoratore - o io? C'è un modo per applicare una restrizione delle autorizzazioni a livello di dispatcher URL?

risposta

8

E 'possibile importare la funzione di login richiesto e applicarlo alla vista generico:

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

come menzione here.

+0

Come utilizzereste 'permission_required' nello stesso modo? In particolare, come si passa l'argomento del nome del permesso? –

+0

@Manoj: consulta questa sezione della documentazione: http://docs.djangoproject.com/en/dev/topics/auth/#limiting-access-to-generic-views l'idea è di scrivere un wrapper sottile (con permission_required decorator) attorno alla vista generica e punta il tuo urlconf a quel wrapper ... – Hoff

+0

Questo è quello che ho fatto nella mia risposta. Volevo solo sapere se c'era un altro modo per farlo. Grazie. –

-1

Un approccio sarebbe quello di avvolgere le viste che non hai scritto.

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

Ho un little hack sulla resolver URL Django, si può applicare un decoratore a livello spedizione 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 decoratore è una parola di fantasia per una funzione che avvolge un'altra funzione. login_required è una funzione wrapper per una vista mentre permission_required crea un wrapper per la visualizzazione. In altre parole, login_required è esso stesso un decoratore e permission_required(perm) costruisce un decoratore.

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

sei il migliore! Questa risposta è più intelligibile del prescelto –

Problemi correlati