Django에서 모든 요청 헤더를 어떻게 얻을 수 있습니까?


107

모든 Django 요청 헤더를 가져와야합니다. 내가 읽은 내용에서 Django는 request.META다른 많은 데이터와 함께 모든 것을 변수에 덤프합니다 . 클라이언트가 내 Django 애플리케이션에 보낸 모든 헤더 를 가져 오는 가장 좋은 방법은 무엇입니까 ?

나는 이것들을 사용하여 httplib요청 을 작성할 것 입니다.

답변:


139

문서 에 따르면 request.META"사용 가능한 모든 HTTP 헤더를 포함하는 표준 Python 사전"입니다. 모든 것을 얻고 싶다면 헤더 사전을 반복하면됩니다.

이 작업을 수행 할 코드 부분은 정확한 요구 사항에 따라 다릅니다. 액세스 권한이있는 모든 곳에서 request해야합니다.

최신 정보

미들웨어 클래스에서 액세스해야하지만 반복 할 때 HTTP 헤더와는 별개로 많은 값을 얻습니다.

문서에서 :

제외 CONTENT_LENGTH하고 CONTENT_TYPE위에서 주어진 바와 같이, 모든 HTTP요청의 헤더로 변환되고 META, 모든 문자를 대문자로 변환 밑줄 하이픈을 1,8-하여 키 가산 HTTP_이름에 접두사 .

(강조 추가)

HTTP헤더 만 가져 오려면 접두사가 붙은 키로 필터링하면됩니다 HTTP_.

업데이트 2

HTTP_로 시작하고 선행 HTTP_ 부분을 제거하는 request.META 변수에서 모든 키를 필터링하여 헤더 사전을 구축하는 방법을 보여줄 수 있습니까?

확실한. 여기에 한 가지 방법이 있습니다.

import re
regex = re.compile('^HTTP_')
dict((regex.sub('', header), value) for (header, value) 
       in request.META.items() if header.startswith('HTTP_'))

미들웨어 클래스에서 액세스해야하지만 반복 할 때 HTTP 헤더와는 별개로 많은 값을 얻습니다.
Mridang Agarwalla 2010 년

감사합니다 Manoj. 호기심에서-a request.META로 시작 HTTP_하고 선행 HTTP_부분을 제거 하는 변수 에서 모든 키를 필터링하여 헤더 사전을 구축하는 방법을 보여줄 수 있습니까 ? 람다 함수를 통해 가능합니까? (나는 그것들을 람다 함수라고 생각한다) 나는 아마 먼저 그것들을 반복하고, 그것이 a로 시작하는지 확인한 HTTP_다음 그것을 새 사전에 추가함으로써 먼 길을 계속할 것이기 때문에 이것을 묻고있다 . 다시 한 번 감사드립니다.
Mridang Agarwalla 2010 년

다시 한번 감사합니다 Manoj. lstrip('HTTP_')정규식 대신 사용하도록 약간 수정했습니다 . :)
Mridang Agarwalla 2010 년

3
@Mridang Agarwalla : lstrip실제로 당신이 요청한 것을하지 않을 것입니다. lstrip당신은 헤더가 만약 그렇다면, 당신이 그것을 줄 문자열의 모든 문자와 일치하는 모든 주요 문자를 제거합니다 "HTTP_TOKEN_ID"그것을 돌려 줄 것이다 "OKEN_ID"때문에, "T"의 시작 부분 "TOKEN"일치 문자열에서 문자가 lstrip에 전달. 그것을하는 방법은 prefix = 'HTTP_'; header = header[len(prefix):]입니다.
jcdyer

2
Django 2.2는 HttpRequest.headers.
Dcalsky

30

Django 2.2부터 request.headersHTTP 헤더에 액세스하는 데 사용할 수 있습니다 . HttpRequest.headers에 대한 문서에서 :

요청에서 모든 HTTP 접두어 헤더 (Content-Length 및 Content-Type 포함)에 대한 액세스를 제공하는 대소 문자를 구분하지 않는 dict-like 객체입니다.

각 헤더의 이름은 표시 될 때 제목 케이스 (예 : 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() .


17

이것은 위의 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_TYPECONTENT_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_TYPECONTENT_LENGTH.

각 헤더의 값은 수정되지 않아야합니다.


5
그것은 모두 하나의 정규 표현식으로 결합 될 수 있습니다.re.compile(r'^(HTTP_.+|CONTENT_TYPE|CONTENT_LENGTH)$')
Rebs dec

6

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

그래도이 파일에서 얻을 수 있습니다 ...


3

HTTP 헤더 만 얻는 쉬운 방법은 없다고 생각합니다. 필요한 모든 것을 얻으려면 request.META dict를 반복해야합니다.

django-debug-toolbar는 헤더 정보를 표시하기 위해 동일한 접근 방식을 사용합니다. 헤더 정보 검색을 담당하는 이 파일을 살펴보십시오 .


1

요청 헤더에서 클라이언트 키를 얻으려면 다음을 시도하십시오.

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

그만한 가치는 들어오는 HTTP 요청을 사용하여 다른 HTTP 요청을 만드는 것입니다. 일종의 관문과 같습니다. 이를 정확히 수행 하는 훌륭한 모듈 django-revproxy 가 있습니다.

소스는 수행하려는 작업을 수행하는 방법에 대한 꽤 좋은 참고 자료입니다.


0
<b>request.META</b><br>
{% for k_meta, v_meta in request.META.items %}
  <code>{{ k_meta }}</code> : {{ v_meta }} <br>
{% endfor %}

0

간단히 Django 2.2 부터 HttpRequest.headers 를 사용할 수 있습니다 . 예를 들어 다음과 직접적 공식에서 가져 장고 문서 에서 요청 및 응답 객체 섹션을 참조하십시오.

>>> 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.