2012-04-04 4 views
3

jetzt für die Erlaubnis Prüfung Ich bin mit dieser App basierte: django-rulesWie ein Dekorateur für eine Klasse basierten Sicht schreiben - permision auf Objekt aus Sicht

aber es ist nicht mehr als ein Jahr aktualisiert jetzt und es gibt keinen Dekorateur für die "neuen" (seit Django 1.3) klassenbasierten Ansichten. Ich mag an der urls.py wie diese verwenden können:

url(r'^casos/(?P<pk>\d+)/editar/$', rules_permission_required('lawsuits.logical_check', raise_exception=True)(CaseUpdateView.as_view()), name='case_edit'), 

Ich kann nicht herausfinden, wie das Objekt aus der Klasse basierte Blick aus dem Dekorateur zu bekommen. Habt ihr eine Idee? Hier ist, was ich bis jetzt habe:

from django.utils.decorators import available_attrs 
def rules_permission_required(perm, queryset=None, login_url=None, raise_exception=False): 
    def wrapper(view_func): 
     @wraps(view_func, assigned=available_attrs(view_func)) 
     def inner(request, *args, **kwargs): 
      #view_func is the class based view -> <function MyEditView at 0x94e54c4> 

      print view_func.get_object() # doesnt work 
      print view_func(request, *args, **kwargs).get_object() # doesnt work either 

      #any ideas? 

      if not request.user.has_perm(perm, obj=obj): 
       return redirect_to_login(request, login_url, raise_exception) 
      return view_func(request, *args, **kwargs) 
     return inner 
    return wrapper 

Vielen Dank im Voraus!

Antwort

7

Verwenden method_decorator auf der dispatch() Methode: https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-class-based-views

from django.utils.decorators import method_decorator 
class ClassBasedView(View): 
    @method_decorator(rules_permission_required) 
    def dispatch(self, *args, **kwargs): 
     return super(ClassBasedView, self).dispatch(*args, **kwargs) 

Oder Sie die Ausgabe der as_view Klassenmethode schmücken könnten, entweder in Ihrer URL config (wie in dem Link oben beschrieben), oder durch die Einsparung die Instanz in eine Variable.

class ClassBasedView(View): 
    def dispatch(self, *args, **kwargs): 
     return super(ClassBasedView, self).dispatch(*args, **kwargs) 
class_based_view = rules_permission_required(ClassBasedView.as_view()) 

Obwohl ich nicht ganz sicher bin, ob das letzte Beispiel Fäden Sicherheitsprobleme verursachen könnte (abhängig davon, wie Django die Instanzen behandelt). Der beste Weg ist wohl, bei der method_decorator zu bleiben.

0

landete ich eine Klasse Dekorateur mit

def rules_permission_required(perm, queryset=None, login_url=None, raise_exception=False): 

    def wrapper(cls):     
     def view_wrapper(view_func): 
      @wraps(view_func, assigned=available_attrs(view_func)) 
      def inner(self, request, *args, **kwargs): 
       # get object 
       obj = get_object_from_classbased_instance(
         self, queryset, request, *args, **kwargs 
        ) 

       # do anything you want 
      return inner 
     cls.dispatch = view_wrapper(cls.dispatch) 
     return cls 
    return wrapper 
+2

Kann jemand erklären, warum eine Verbesserung der Umstellung auf Klasse basierte Ansichten, wenn es übermäßig Dinge wie diese erschwert. Scheint ein Schritt in die falsche Richtung zu sein, wenn Sie mich fragen. – fred