mizzsugar’s blog

日々感じていることや学んだことを書きます。エンジニアリング以外にも書くかもしれません。

【Django】独自ヘッダーをつけてリクエストを送る

地味に苦労したやつです。

利用技術

- python 3.7.3

- Django 2.2.1

ヘッダーに関して、Djangoの公式ドキュメントはなんて言っているでしょうか。

HttpRequest.META
利用できるすべての HTTP ヘッダーが格納されたディクショナリです。
-- Django公式ドキュメントより

https://docs.djangoproject.com/ja/2.2/ref/request-response/#django.http.HttpRequest.META


なるほど、request.METAから取り出せば良いのか。

curl -X POST -H 'Content-Type:application/json' -H "CUSTOM_HEADER:customheader" http://127.0.0.1/api/


def sample_view(request):
    print(request.META.get('CUSTOM_HEADER')
    ...

printの中身がNoneになる・・・ なぜや〜


もうちょっと公式ドキュメントを読むと・・・

With the exception of CONTENT_LENGTH and CONTENT_TYPE, as given above,
any 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.

-- Django公式ドキュメントより

https://docs.djangoproject.com/ja/2.2/ref/request-response/#django.http.HttpRequest.META


CONTENT_LENGTHとCONTENT_TYPEは例外として、上記に示されているように、
リクエストのHTTPヘッダーはMETAキーに変換されます。全て大文字になり、ハイフンがアンダースコアになり、ヘッダー名の頭に「HTTP_」がつきます。
例えば、「X-Bender」というヘッダーは「HTTP_X_BENDER」というMETAキーに格納されます。
-- mizzsugarによる意訳

request.METAに変換する際にヘッダー名が変換されるということっぽい。

これならいけるか?

request.META.get('HTTP_CUSTOM_HEADER')

ダメだった・・・

「ハイフンがアンダースコアになり」。ということは、アンダースコアはダメ?

これでどうだ↓

curl -X POST -H 'Content-Type:application/json' -H "CUSTOM-HEADER:customheader" http://127.0.0.1/api/


request.META.get('HTTP_CUSTOM_HEADER')


取得できました!

どうやら、こういう仕様のようです。

* 名前に区切りを使いたいならハイフンを使わないといけない
* request.METAから取り出す場合は全て大文字にして、名前の頭に「HTTP_」をつけ、ハイフンの箇所をアンダースコアにする

ハイフンじゃないと反応しないというところが個人的にハマりポイントでした(^^;