programing

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

nasanasas 2020. 9. 1. 07:35
반응형

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


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

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


문서 에 따르면 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_'))

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

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


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().


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

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


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

django-debug-toolbar takes the same approach to show header information. Have a look at this file responsible for retrieving header information.


If you want to get client key from request header, u can try following:

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 %}

For what it's worth, it appears your intent is to use the incoming HTTP request to form another HTTP request. Sort of like a gateway. There is an excellent module django-revproxy that accomplishes exactly this.

The source is a pretty good reference on how to accomplish what you are trying to do.

참고URL : https://stackoverflow.com/questions/3889769/how-can-i-get-all-the-request-headers-in-django

반응형