[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?
Danke für die Aufklärung über die vielfältigen Dekorateur Anrufe: Sie könnten versuchen, den Dekorateur
dispatch
stattget
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 :) –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. –