すべてのDjangoリクエストヘッダーを取得する必要があります。私が読んだものから、Djangoは単にすべてをrequest.META
変数にダンプします。 allクライアントがmy Django application?に送信したヘッダーを取得する最良の方法は何でしょうか?
これらを使用してhttplib
リクエストを作成します。
ドキュメントrequest.META
によれば、「標準Python利用可能なすべてのHTTPヘッダーを含む辞書」です。取得したい場合 all単純に辞書を反復処理できるヘッダー。
これを行うコードの部分は、正確な要件によって異なります。 request
にアクセスできる場所ならどこでもできます。
更新
ミドルウェアクラスでアクセスする必要がありますが、繰り返し処理を行うと、HTTPヘッダーとは別に多くの値を取得します。
ドキュメントから:
上記の
CONTENT_LENGTH
およびCONTENT_TYPE
を除き、リクエスト内のHTTP
ヘッダーはすべての文字を大文字に変換してMETA
キーに変換され、ハイフンはアンダースコアと_HTTP_
プレフィックスを名前に追加する。
(エンファシスを追加)
HTTP
ヘッダーのみを取得するには、HTTP_
で始まるキーでフィルタリングします。
更新2
hTTP_で始まりHTTP_の先頭部分を削除するrequest.META変数からすべてのキーをフィルタリングして、ヘッダーの辞書を作成する方法を教えてください。
承知しました。これを行う1つの方法を次に示します。
import re
regex = re.compile('^HTTP_')
dict((regex.sub('', header), value) for (header, value)
in request.META.items() if header.startswith('HTTP_'))
これは別の方法で、上記のManoj Govindanの答えに非常に似ています:
import re
regex_http_ = re.compile(r'^HTTP_.+$')
regex_content_type = re.compile(r'^CONTENT_TYPE$')
regex_content_length = re.compile(r'^CONTENT_LENGTH$')
request_headers = {}
for header in request.META:
if regex_http_.match(header) or regex_content_type.match(header) or regex_content_length.match(header):
request_headers[header] = request.META[header]
また、CONTENT_TYPE
およびCONTENT_LENGTH
リクエストヘッダーとHTTP_
ヘッダーも取得します。 request_headers['some_key]
== request.META['some_key']
。
特定のヘッダーを含める/除外する必要がある場合は、適宜変更します。 Djangoはすべてではありませんが、それらのすべてをリストします: https://docs.djangoproject.com/en/dev/ref/request-response/#Django.http .HttpRequest.META
Djangoのリクエストヘッダーのアルゴリズム:
-
をアンダースコア_
に置き換えますHTTP_
およびCONTENT_TYPE
を除く、元のリクエストのすべてのヘッダーにCONTENT_LENGTH
を付加します。各ヘッダーの値は変更しないでください。
Django 2.2から、_request.headers
_を使用してHTTPヘッダーにアクセスできます。 HttpRequest.headersのドキュメント から:
要求からすべてのHTTPプレフィックスヘッダー(およびContent-LengthとContent-Type)へのアクセスを提供する、大文字と小文字を区別しないdictのようなオブジェクト。
各ヘッダーの名前は、表示されるときにタイトルケース(User-Agentなど)で様式化されます。大文字と小文字を区別せずにヘッダーにアクセスできます。
_>>> request.headers {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...} >>> 'User-Agent' in request.headers True >>> 'user-agent' in request.headers True >>> request.headers['User-Agent'] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers['user-agent'] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers.get('User-Agent') Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers.get('user-agent') Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
_
すべてのヘッダーを取得するには、request.headers.keys()
またはrequest.headers.items()
を使用できます。
request.META.get( 'HTTP_AUTHORIZATION')/python3.6/site-packages/rest_framework/authentication.py
ただし、このファイルから取得できます...
HTTPヘッダーのみを取得する簡単な方法はないと思います。 request.META dictを反復処理して、必要なものをすべて取得する必要があります。
Django-debug-toolbarは同じアプローチを使用してヘッダー情報を表示します。 このファイルを見て、ヘッダー情報を取得します。
リクエストヘッダーからクライアントキーを取得したい場合は、以下を試すことができます:
from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions
from apps.authentication.models import CerebroAuth
class CerebroAuthentication(BaseAuthentication):
def authenticate(self, request):
client_id = request.META.get('HTTP_AUTHORIZATION')
if not client_id:
raise exceptions.AuthenticationFailed('Client key not provided')
client_id = client_id.split()
if len(client_id) == 1 or len(client_id) > 2:
msg = ('Invalid secrer key header. No credentials provided.')
raise exceptions.AuthenticationFailed(msg)
try:
client = CerebroAuth.objects.get(client_id=client_id[1])
except CerebroAuth.DoesNotExist:
raise exceptions.AuthenticationFailed('No such client')
return (client, None)
<b>request.META</b><br>
{% for k_meta, v_meta in request.META.items %}
<code>{{ k_meta }}</code> : {{ v_meta }} <br>
{% endfor %}
価値のあることは、着信HTTPリクエストを使用して別のHTTPリクエストを形成することが目的のようです。ゲートウェイのようなもの。まさにこれを実現する優れたモジュール Django-revproxy があります。
ソースは、あなたがやろうとしていることを達成する方法についての非常に良いリファレンスです。