web-dev-qa-db-fra.com

Obtention d'un en-tête personnalisé sur une demande de publication avec Django Rest Framework

J'envoie une demande de publication à mon API à l'aide de la structure de repos Django:

curl --header "X-MyHeader: 123" --data "test=test" http://127.0.0.1:8000/api/update_log/

Dans ma vue de repos, je souhaite obtenir mon en-tête costum et, si l'en-tête personnalisé remplit une condition, je procéderai à l'analyse de mes données de publication.

Ok, ma vue ressemble à:

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)

J'essaie de trouver mon en-tête personnalisé sur l'élément request.Meta, mais lorsque j'imprime request.Meta, l'erreur 500 apparaît. Si j'imprime request.data, j'obtiens la réponse attendue.

¿Quel est le moyen d’obtenir un en-tête personnalisé sur ma demande de publication à l’aide de Django Rest Framework?

16
Andrés Quiroga

Le nom de l'attribut meta data de request est en majuscule:

print request.META

Votre entête sera disponible en tant que:

request.META['HTTP_X_MYHEADER']

Ou:

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

Extrait de la documentation :

Les en-têtes HTTP de la demande sont convertis en clés META en convertissant tous les caractères en majuscules, en remplaçant les traits d'union par des traits de soulignement et en ajoutant un préfixe HTTP_ au nom. Ainsi, par exemple, un en-tête appelé X-Bender serait associé à la clé METAHTTP_X_BENDER.

33
catavaran

Si vous fournissez une information d’en-tête valide et obtenez cette information à partir du backend, suivez les

client-name='ABCKD'

alors vous avez obtenir cette information client en post ou obtenir fonction après this-

request.META['HTTP_CLIENT_NAME']

cela vous donnera la sortie 'ABCKD'.

n'oubliez pas que, quel que soit le nom de variable valide que vous fournissez dans les informations d'en-tête de la requête, Django la convertit en majuscule et préfixe 'HTTP_' Ici, le nom du client sera converti en CLIENT_NAME et le préfixe avec HTTP_. final la sortie est HTTP_CLIENT_NAME

0
Mehedi Hasan