Getting custom header on post request with django

2019-01-26 04:55发布

问题:

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?

回答1:

The name of the meta data attribute of request is in upper case:

print request.META

Your header will be available as:

request.META['HTTP_X_MYHEADER']

Or:

request.META.get('HTTP_X_MYHEADER') # return `None` if no such header

Quote from the documentation:

HTTP headers in the request are converted to META keys by converting all characters to uppercase, replacing any hyphens with underscores and adding an HTTP_ prefix to the name. So, for example, a header called X-Bender would be mapped to the META key HTTP_X_BENDER.



回答2:

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