2017-01-12 1 views
0

Ist es möglich, eine Methode in meiner APIView-Klasse, die das gleiche Stück Code unabhängig von der Methode, das heißt GET/POST/PUT führt.Django Rest Framework APIView gleichen Code für alle Methoden

+0

Möchten Sie für jede API für die Methode GET/POST/PUT denselben Code ausführen? oder nur die GET/POST/PUT-Methode einer API? – zhaorong

+0

gleich für Get und Post .. anders für Put. Eine Lösung für alle Methoden wäre ebenfalls wünschenswert. –

Antwort

0

Vielleicht könnten Sie django Middleware verwenden, um diese Anforderung zu erfüllen.

class CommonResponseMiddleware: 

    def __init__(self): 
     pass 

    def process_request(self, request): 

     path = request.path_info.lstrip('/') 

     method = request.method.upper() 

     if method == "DELETE": 
      request.META['REQUEST_METHOD'] = 'DELETE' 
      request.DELETE = QueryDict(request.body) 
     if method == "PUT": 
      request.META['REQUEST_METHOD'] = 'PUT' 
      request.PUT = QueryDict(request.body) 

     params = {} 
     if method == "GET": 
      params = request.GET.items() 
      # do what ever you want for GET method 
     if method == "POST": 
      params = request.POST.items() 
      # do what ever you want for POST method 
     if method == "PUT": 
      params = request.PUT.items() 
      # do what ever you want for PUT method 
     if method == "DELETE": 
      params = request.DELETE.items() 
      # do what ever you want for DELETE method 

dann diese Middleware in settings.py gelten.

MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', # <--here 
    #'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.middleware.gzip.GZipMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'authentication.auth.middleware.LoginRequiredMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'core.middleware.CommonResponseMiddleware', 
] 

Sie könnten mehr über Middleware finden, hoffe, es könnte Ihnen helfen.

+0

Danke für diese Lösung, aber ich möchte keine Middleware verwenden. Ich wollte nur wissen, ob dafür eine einfache und direkte Lösung existiert. –

+0

Die Verwendung einer Middleware würde Ihre Website für diese Art der Nutzung lahmlegen. es würde für jede Anfrage ausgeführt werden - unabhängig von diesem einfachen Anwendungsfall – Sayse

+0

Verstanden ... Middleware ist meines Erachtens flexibel genug, Sie könnten alle API oder nur eine API an diesem Ort behandeln. Viel Glück, um die Methode zu finden, die Sie wollen:) – zhaorong

1

Wie bei django arbeitet die APIView die gleiche Art und Weise, indem man zuerst durch den Versandweg gehen, bevor die Anforderungsmethode entscheiden, so zu verwenden, dass in Ihrer eigenen Ansicht außer Kraft setzen könnte

def dispatch(self, request): 
    return super().dispatch(request) 

Siehe dispatch methods für weitere Informationen.

Verwandte Themen