2014-03-30 6 views
5

Ich habe eine PUT-Anfrage und ich möchte die Werte von einigen der Parameter in meiner Middleware aktualisieren. Ich weiß, dass es keinen Weg gibt, direkt auf die PUT-Parameter zuzugreifen, also greife ich darauf über request.body zu.Wie Update Django HttpRequest Körper in Middleware

Sobald diese Werte aktualisiert wurden, muss ich diese request auf die Ansicht übergeben. wenn ich versuche, jedoch zu tun:

request.body = new_content 

in meiner Middleware, die ich erhalten:

AttributeError: can't set attribute 

Gibt es eine Möglichkeit, diese params in der Middleware zu aktualisieren und übergeben sie an?

Antwort

9

request.body ist definiert als property in Klasse.

Dies ist Code wie body Eigenschaft wie folgt aussieht:

@property 
def body(self): 
    if not hasattr(self, '_body'): 
     if self._read_started: 
      raise RawPostDataException("You cannot access body after reading from request's data stream") 
     try: 
      self._body = self.read() 
     except IOError as e: 
      six.reraise(UnreadablePostError, UnreadablePostError(*e.args), sys.exc_info()[2]) 
     self._stream = BytesIO(self._body) 
    return self._body 

Die aproach, die ich dort zu verwenden ist _body Attribut in der process_request Methode zu ändern. Der Rückgabewert ist hier None, weil ich möchte, dass Django diese Anfrage über Middleware weiter bearbeitet bis zur entsprechenden Ansicht.

class MidddlewareWithHttpPutRequest: 
    def process_request(self, request): 
     data = getattr(request, '_body', request.body) 
     request._body = data + '&dummy_param=1' 
     # if you call request.body here you will see that new parameter is added 
     return None 
+2

Um eine Notiz hinzuzufügen: request.body wird request.read() aufrufen, die aus einem Datei-ähnlichen Puffer 'request._stream' liest. Ich musste diesen Puffer ebenfalls "auffüllen" (Django Rest Framework liest aus diesem Puffer). Sie können dies über 'request._stream = BytesIO (body_contents)' tun –