모든 Django 요청 헤더를 가져와야합니다. 내가 읽은 내용에서 Django는 request.META
다른 많은 데이터와 함께 모든 것을 변수에 덤프합니다 . 클라이언트가 내 Django 애플리케이션에 보낸 모든 헤더 를 가져 오는 가장 좋은 방법은 무엇입니까 ?
나는 이것들을 사용하여 httplib
요청 을 작성할 것 입니다.
모든 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_'))
request.META
로 시작 HTTP_
하고 선행 HTTP_
부분을 제거 하는 변수 에서 모든 키를 필터링하여 헤더 사전을 구축하는 방법을 보여줄 수 있습니까 ? 람다 함수를 통해 가능합니까? (나는 그것들을 람다 함수라고 생각한다) 나는 아마 먼저 그것들을 반복하고, 그것이 a로 시작하는지 확인한 HTTP_
다음 그것을 새 사전에 추가함으로써 먼 길을 계속할 것이기 때문에 이것을 묻고있다 . 다시 한 번 감사드립니다.
lstrip('HTTP_')
정규식 대신 사용하도록 약간 수정했습니다 . :)
lstrip
실제로 당신이 요청한 것을하지 않을 것입니다. lstrip
당신은 헤더가 만약 그렇다면, 당신이 그것을 줄 문자열의 모든 문자와 일치하는 모든 주요 문자를 제거합니다 "HTTP_TOKEN_ID"
그것을 돌려 줄 것이다 "OKEN_ID"
때문에, "T"
의 시작 부분 "TOKEN"
일치 문자열에서 문자가 lstrip에 전달. 그것을하는 방법은 prefix = 'HTTP_'; header = header[len(prefix):]
입니다.
HttpRequest.headers
.
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
.각 헤더의 값은 수정되지 않아야합니다.
re.compile(r'^(HTTP_.+|CONTENT_TYPE|CONTENT_LENGTH)$')
request.META.get ( 'HTTP_AUTHORIZATION')
/python3.6/site-packages/rest_framework/authentication.py
그래도이 파일에서 얻을 수 있습니다 ...
요청 헤더에서 클라이언트 키를 얻으려면 다음을 시도하십시오.
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 가 있습니다.
소스는 수행하려는 작업을 수행하는 방법에 대한 꽤 좋은 참고 자료입니다.
간단히 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)