2010-08-11 17 views
7

In meiner Django-Anwendung habe ich bestimmte Berechtigungen, die Benutzer benötigen, um auf bestimmte Ansichten zuzugreifen (mit django.contrib.auth). Dies funktioniert gut, mit der @permission_required Dekorateur auf meine Ansicht Funktionen.Django: Berechtigungen im URL-Dispatcher anwenden?

jedoch lösen einige meiner URLs zu Ansichten, die ich nicht, wie die eingebaute in django.contrib.auth.views.password_change, wie in der folgenden urls.py schrieb:

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

In diesem Beispiel habe ich nirgends meine anwenden @permission_required Dekorateur - oder soll ich? Gibt es eine Möglichkeit, eine Zugriffsbeschränkung auf der URL-Dispatcher-Ebene anzuwenden?

Antwort

8

Es ist möglich, die Anmeldung erforderlich Funktion und es auf die allgemeine Ansicht zu importieren:

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

wie erwähnt here.

+0

Wie würden Sie 'permission_required' auf die gleiche Weise verwenden? Wie würden Sie das Argument des Berechtigungsnamens übergeben? –

+0

@Manoj: Sehen Sie sich diesen Abschnitt der Dokumentation an: http://docs.djangoproject.com/en/dev/topics/auth/#limiting-access-to-generic-views Die Idee ist, einen dünnen Wrapper (mit permission_required decorator) um die generische Ansicht herum, und zeigen Sie Ihre urlconf auf diese Wrapper ... – Hoff

+0

Das ist, was ich in meiner Antwort getan habe. Ich wollte nur wissen, ob es anders geht. Vielen Dank. –

-1

Ein Ansatz wäre, die Ansichten, die Sie nicht geschrieben haben, zu umbrechen.

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

ich eine little hack über die Django URL Resolver haben, können Sie einen Dekorateur auf URL Dispatch Ebene gelten:

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

Ein Dekorateur ist ein ausgefallenes Wort für eine Funktion, die eine andere Funktion wickelt. login_required ist eine Wrapper-Funktion für eine Ansicht, während permission_required einen Wrapper für Ihre Ansicht erstellt. Mit anderen Worten, login_required ist selbst ein Dekorateur und permission_required(perm) konstruiert einen Dekorateur.

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

Sie sind der beste! Diese Antwort ist verständlicher als die Auserwählte –

Verwandte Themen