web-dev-qa-db-ja.com

Djangoですべてのリクエストヘッダーを取得するにはどうすればよいですか?

すべてのDjangoリクエストヘッダーを取得する必要があります。私が読んだものから、Djangoは単にすべてをrequest.META変数にダンプします。 allクライアントがmy Django application?に送信したヘッダーを取得する最良の方法は何でしょうか?

これらを使用してhttplibリクエストを作成します。

91

ドキュメント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_'))
123
Manoj Govindan

これは別の方法で、上記の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のリクエストヘッダーのアルゴリズム:

  1. ハイフン-をアンダースコア_に置き換えます
  2. 大文字に変換します。
  3. HTTP_およびCONTENT_TYPEを除く、元のリクエストのすべてのヘッダーにCONTENT_LENGTHを付加します。

各ヘッダーの値は変更しないでください。

17
Dave Gallagher

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()を使用できます。

13
Daniel Hepper

request.META.get( 'HTTP_AUTHORIZATION')/python3.6/site-packages/rest_framework/authentication.py

ただし、このファイルから取得できます...

5

HTTPヘッダーのみを取得する簡単な方法はないと思います。 request.META dictを反復処理して、必要なものをすべて取得する必要があります。

Django-debug-toolbarは同じアプローチを使用してヘッダー情報を表示します。 このファイルを見て、ヘッダー情報を取得します。

4
Srikanth Chundi

リクエストヘッダーからクライアントキーを取得したい場合は、以下を試すことができます:

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)
1
Tony Jasur
<b>request.META</b><br>
{% for k_meta, v_meta in request.META.items %}
  <code>{{ k_meta }}</code> : {{ v_meta }} <br>
{% endfor %}
0
S. Nick

価値のあることは、着信HTTPリクエストを使用して別のHTTPリクエストを形成することが目的のようです。ゲートウェイのようなもの。まさにこれを実現する優れたモジュール Django-revproxy があります。

ソースは、あなたがやろうとしていることを達成する方法についての非常に良いリファレンスです。

0