Reputation: 1937
I'm sending a post request to my API made using django rest framework:
curl --header "X-MyHeader: 123" --data "test=test" http://127.0.0.1:8000/api/update_log/
In my rest framework view, I want to get my costum header, and if the custom header satisfies a condition, I will proceed to analyze my post data.
Ok, my view looks like:
class PostUpdateLogView(APIView):
throttle_classes = ()
permission_classes = ()
parser_classes = (
parsers.FormParser,
parsers.MultiPartParser,
parsers.JSONParser,
)
renderer_classes = (renderers.JSONRenderer,)
def post(self, request):
print request.Meta
# Get custom header
# Validate custom header
# Proceed to analize post data
# Make response
content = {
'response': 'response',
}
return Response(content)
I'm trying to find my custom header on request.Meta element, but when I print request.Meta, I get a 500 error. If I print request.data, I get the expected response.
¿What is the way to get a custom header on my post request using django rest framework?
Upvotes: 51
Views: 57627
Reputation: 841
Seeing this is an old post, I thought I would share the newer and more flexible approach that is available since Django 2.2. You can use the request's headers object:
# curl --header "X-MyHeader: 123" --data "test=test" http://127.0.0.1:8000/api/update_log/
request.headers['X-MYHEADER'] # returns "123"
request.headers['x-myheader'] # case-insensitive, returns the same
request.headers.get('x-myheader') # returns None if header doesn't exist
# standard headers are also available here
request.headers.get('Content-Type') # returns "application/x-www-form-urlencoded"
The biggest differences with request.META
are that request.headers
doesn't prepend headers with HTTP_
, it doesn't transform the header names to UPPER_SNAKE_CASE
and that the headers can be accessed case-insensitively. It will only transform the header to Title-Casing
(e.g. X-Myheader
) when displayed.
Upvotes: 20
Reputation: 45595
The name of the meta data attribute of request is in upper case:
print request.META
If your header is called "My-Header", your header will be available as:
request.META['HTTP_MY_HEADER']
Or:
request.META.get('HTTP_MY_HEADER') # return `None` if no such header
HTTP headers in the request are converted to
META
keys by converting all characters to uppercase, replacing any hyphens with underscores and adding anHTTP_
prefix to the name. So, for example, a header calledX-Bender
would be mapped to theMETA
keyHTTP_X_BENDER
.
Upvotes: 90
Reputation: 1792
If you provide a valid header information and get that information from backend then follow those
client-name='ABCKD'
then you have get that client information in post or get function following this-
request.META['HTTP_CLIENT_NAME']
it will give you output 'ABCKD'.
remember that, whatever the valid variable name you provide in your header information in request, django convert it uppercase and prefix with 'HTTP_
'
in here it will client-name converted to CLIENT_NAME
and prefix with HTTP_
.
so final output is HTTP_CLIENT_NAME
Upvotes: 12