[python] 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_'))
답변
Django 2.2부터 request.headers
HTTP 헤더에 액세스하는 데 사용할 수 있습니다 . 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()
.
답변
이것은 위의 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
.
각 헤더의 값은 수정되지 않아야합니다.
답변
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)
답변
그만한 가치는 들어오는 HTTP 요청을 사용하여 다른 HTTP 요청을 만드는 것입니다. 일종의 관문과 같습니다. 이를 정확히 수행 하는 훌륭한 모듈 django-revproxy 가 있습니다.
소스는 수행하려는 작업을 수행하는 방법에 대한 꽤 좋은 참고 자료입니다.