2017-03-02 3 views
2

Ich verwende djangorestframework mit dem folgenden Code:request.META nicht Header enthalten

class RegistrationView(APIView): 
    def post(self, request, format=None): 
     print self.request.META.get('API_KEY') 

Und es gibt None (andere Header wie Content-Type oder User-Agent OK sind).

Aber diese Header auf jeden Fall in Anforderung existieren (dieser Schlüssel ist local-db nur, so ist es in Ordnung, dann ist es hier einfügen):

Sniffer

Warum?

Antwort

5

Das Problem besteht mit dem Unterstrich im Anforderungsheader.

Stellen Sie den Header als API-KEY (Verwendung Bindestrich, unterstreichen nicht) und Sie können es

request.META.get('HTTP_API_KEY') 

Der Grund für dieses Verhalten mit erfassen ist, dass einige Server nur Unterstrichen ignorieren.

Sehen Sie diese Frage im Zusammenhang Why underscores are forbidden in HTTP header names

1

Alle benutzerdefinierten Header werden mit HTTP_ Schlüsselwörter in META vorangestellt.

So können Sie den Header versuchen Zugriff wie

request.META.get('HTTP_API_KEY') 
+0

Hm, funktioniert nicht. Das ist request.META Inhalte: http://pastebin.com/GFRVyv4H – arts777

0

Manchmal Vorverarbeitung Frameworks, wie Lack für Caching, eingerichtet sind alle benutzerdefinierten Header auf der Anfrage gefunden zu verwerfen. Vielleicht wird so etwas auf deinem Server gemacht?

+0

Das ist lokale dev-Server (in Django eingebettet). – arts777

0

Da Sie sowohl tokenbasierte als auch sitzungsbasierte Authentifizierung verwenden. Ich nehme an, dass Sie es über den Browser testen, in diesem Fall werden Sie mit der Sitzung authentifiziert, die Sie tatsächlich von den Cookies erhalten können, und dann den Benutzer und den Token umgekehrt auswählen.

Versuchen Sie es trotzdem mit Curl oder einem REST-Client. Drucken Sie request.META aus - der erste Schlüssel wird HTTP_AUTHORIZATION sein.

Verwandte Themen