2017-01-04 2 views
0

Ich wollte wissen, wie ich Decorator verwenden kann, um JSON-Anfrage in Django zu validieren. Zur Zeit habe ich validations.py Datei mit der Funktion validate, die True zurückgibt, wenn Anfrage gültig ist, sonst gibt False zurück.So verwenden Sie Dekoratoren, um die Anfrage zu validieren und fortzufahren sonst werfen Sie den Fehler

Meine aktuelle Implementierung ist wie:

validations.py:

def validate(request): 
    flag = True 
    .... # Actual logic for validating request and 
     # sets flag to True/False 
    return flag 

views.py

from validations import validate 

def authenticate_user(request): 
    if validate(request): 
     ....... 
     # executes further logic based on request 
     # This checks if right access is present in Database 
     # for the user or not. And hence I want to access request variable as it is 
    else: 
     return "Bad Request" 

ich wissen wollte, wie genau ich Dekorateur hier verwenden können, und tun so etwas wie dies:

@validate 
def authenticate_user(request): 
    ....... 
    # executes further logic based on request 
    # This checks if right access is present in Database 
    # for the user or not. And hence I want to access request variable as it is 

validate Funktion sollte "Bad Request" direkt an den Client zurückgeben, wenn Validierungen aus irgendeinem Grund fehlschlagen, sonst sollte normale Codeausführung erfolgen.

+1

Sie sollte eher ein Authentifizierungs-Backend schreiben als Dekoratoren schreiben. – cutteeth

+0

Dies betrifft nicht nur die Authentifizierung, sondern viele andere benutzerdefinierte Ansichten. Ich habe es nur als Beispiel benutzt. –

Antwort

0

Sie so etwas wie

import inspect 

def decorator(f): 

    def requestchecker(request, *args): 
     if not validate(request): 
      raise ValueError("bad request") 
     return f(request, *args) 
    return requestchecker 


@decorator 
def djangoview(request, x, y): 
    # do stuff 

Natürlich tun kann, sollte der eigentliche Code leicht modifiziert werden, je nachdem, ob Sie verwenden Namen oder Positions Argument etc ...

0

Sie können auch mit diesem tun ..

from yourmodel.models import Admin 
from django.http import HttpResponseRedirect 

def admin_required(function): 
    """ 
    @admin_required 
    def dashboard(request): 
     #do_stuff 
    """ 
    def wrap(request, *args, **kwargs): 
     if request.user.is_authenticated() and \ 
       Admin.objects.filter(user=request.user).exists(): 
      return function(request, *args, **kwargs) 
     else: 
      return HttpResponseRedirect('/') 
    wrap.__doc__ = function.__doc__ 
    wrap.__name__ = function.__name__ 
    return wrap 
1

Erster Punkt: Ihre Validierungsfunktion einen boolean-Flag nicht zurückgeben sollte (was man nichts sagt, was schief gelaufen ist), aber eine Ausnahme auslösen (möglicherweise ein ValidationError oder Ihr eigener benutzerdefinierter Ausnahmetyp, je nachdem, was Sie genau bestätigen. - Der Anrufer ist dafür verantwortlich, ihn zu erfassen und das zu tun, was ihm angemessen erscheint.

Zweiter Punkt: Ihre Sicht sollte nicht die Zeichenfolge "Bad Request" zurückgeben, sollte es eine HttpResponse mit dem entsprechenden Statuscode zurückgeben. FWIW, der HTTP-Statuscode für „Bad Request“ ist 400, aber es hat einen sehr gut semantischen definiert (Schwerpunkt liegt ich):

Die Anforderung konnte wegen malformed Syntax vom Server nicht verstanden werden . Der Kunde sollte die Anfrage NICHT wiederholen ohne Änderungen.

Ein fehlendes Feld in einer JSON-Nutzlast ist KEINE "fehlerhafte Syntax".

Was, wie ein Dekorateur verwenden, um eine gleiche Validierungsfunktion auf mehr als eine einzelne View-Funktion anzuwenden, Ihre validate Funktion unter der Annahme einer ValidationError erhöht (oder eine speziellere Ausnahmetyp definiert Sie):

def require_validation(func): 
    def wrapper(request, *args, **kwargs): 
     try: 
      validate(request) 
     except ValidationError as e: 
      # logging the exception might be useful 
      # and you may want to select the exact 
      # response status depending on the exact error 
      # Also if your client posted some json stuff 
      # chances are it expects a json content-type and body 
      return HttpResponse("Bad request", status=400) 

     return function(request, *args, **kwargs) 

    wrapper.__doc__ = function.__doc__ 
    wrapper.__name__ = function.__name__ 
    return wrapper 

@require_validation 
def myview(request, ...): 
    #... 
+0

Ich stimme Ihren Eingaben bezüglich JSON-Antwort und HttpResponse vollkommen zu. Ich benutze das gleiche in meiner Anwendung. Ich habe den Beispielcode zum besseren Verständnis einfach gehalten. Ich werde deine Lösung über Dekorateure ausprobieren. –

Verwandte Themen