1

[bearbeiten] So scheint es, dass mein Code gut funktioniert, ein anderes Stück Code + Müdigkeit ist das Problem [/ bearbeiten].Django Class Based View - unerwartete Decorator Verhalten

Ich habe einen Dekorateur, der eine einfache Überprüfung für ein paar erforderliche Anforderungstasten durchführt.

def fields_required(*fields): 
assert isinstance(fields, tuple), "Fields must be of type tuple." 

def wrap_func(fn): 

    def wrapper(cls, request, *args, **kwargs): 
     print 'oh hi' 
     missing_fields = [] 
     for field in fields: 
      if not request.REQUEST.has_key(field): 
       missing_fields.append(field) 

     if len(missing_fields) > 0: 
      #maybe do smth here 
      return HttpResponseBadRequest()   

     return fn(cls, request, *args, **kwargs) 
    return wrapper 
return wrap_func 

Ich erwarte, dass ein HTTP 403 Bad Request-Statuscode, wenn eines der Felder fehlt jedoch der Dekorateur nie, dass Code ausgeführt wird.

Eine grundlegende Darstellung meiner Ansicht file:

class ViewA(View): 

    @fields_required('name','api_key') 
    def get(self, request, *args, **kwargs): 
     # some logic 

class ViewB(View): 

    @fields_required('SHOULD_NEVER_SEE','THIS_STUFF') 
    def get(self, request, *args, **kwargs): 
     # some logic 

Wenn ViewA im Browser geöffnet wird, ist die Ausgabe der Konsole wie folgt:

('name', 'api_key') 
('SHOULD_NEVER_SEE','THIS_STUFF') 

Ich kann nicht verstehen, warum der Dekorateur für ViewB ausgeführt wird und warum gibt es kein "Oh Hi" in meiner Konsole. Irgendwelche Einsichten?

Antwort

1

Der Decorator für ViewB wird "ausgeführt", aber nicht, weil Sie ViewA anzeigen. Das liegt daran, dass Python die Methode beim Ausführen der Datei selbst dekoriert.

def deco(f): 
    print 'b' 
    def g(): 
     print 'c' 
    return g 

@deco 
def func(): 
    print 'a' 

In Bezug auf die Frage, dass ‚oh hallo‘ nicht gedruckt wird;: Zum Beispiel wird die folgende druckt b obwohl func nicht genannt

@method_decorator(fields_required('SHOULD_NEVER_SEE','THIS_STUFF')) 
def dispatch(self, *args, **kwargs): 
    pass 
+0

Danke für die Aufklärung über die vielfältigen Dekorateur Anrufe: Sie könnten versuchen, den Dekorateur dispatch statt get Zugabe (Folgendes zu Ihrer Ansichten heißt hinzufügen). Die Versandmethode ist nicht das, was ich gesucht habe - vor allem funktioniert es nicht;), und zweitens, ich möchte verschiedene Einschränkungen für das Post/Get dieser Klasse setzen :) –

+0

Basierend auf Ihrer Bearbeitung sehe ich dass du das Problem behoben hast. Und fairerweise ist die Unterscheidung zwischen Versendung oder Get oder Post tatsächlich relevant. –