programing

장고에서 모든 요청 헤더를 가져오려면 어떻게 해야 합니까?

luckcodes 2023. 7. 22. 15:54

장고에서 모든 요청 헤더를 가져오려면 어떻게 해야 합니까?

저는 모든 장고 요청 헤더를 가져와야 합니다.제가 읽은 바로는, 장고는 모든 것을 그냥 집어던집니다.request.META변수 및 기타 많은 데이터.고객이 내 장고 애플리케이션으로 보낸 헤더를 모두 가져오는 가장 좋은 방법은 무엇입니까?

저는 이것들을 사용하여 건물을 지을 것입니다.httplib부탁한다.

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

이 작업을 수행할 코드의 어느 부분이 정확한 요구 사항에 따라 달라집니다.액세스 권한이 있는 모든 장소request해야 합니다.

갱신하다

미들웨어 클래스에서 액세스해야 하지만 반복하면 HTTP 헤더 외에도 많은 값이 표시됩니다.

설명서에서 다음을 참조하십시오.

을 제외하고는CONTENT_LENGTH그리고.CONTENT_TYPE위에 주어진 바와 같이, 임의의HTTP요청의 헤더가 다음으로 변환됩니다.META모든 문자를 대문자로 변환하고 하이픈을 밑줄로 바꾸고 이름접두사를 추가하여 키를 만듭니다.

(강조 추가)

다음 정보를HTTP머리글만, 접두사가 붙은 키로 필터링HTTP_.

업데이트 2

요청에서 모든 키를 필터링하여 헤더 사전을 작성하는 방법을 보여줄 수 있습니까?HTTP_로 시작하여 선행 HTTP_ 부분을 제거하는 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.headersHTTP 헤더에 액세스합니다.HttpRequest에 대한 문서에서 확인합니다.머리글:

요청에서 모든 HTTP 접두사 헤더(및 Content-Length 및 Content-Type)에 대한 액세스를 제공하는 대/소문자를 구분하지 않는 딕트와 유사한 개체입니다.

각 헤더의 이름은 표시될 때 제목 대소문자로 스타일화됩니다(예: 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.

요청 헤더에 대한 장고의 알고리즘:

  1. 을 바꿉니다.-_
  2. 대문자로 변환합니다.
  3. 프리펜드 드HTTP_요청의 됩니다.CONTENT_TYPE그리고.CONTENT_LENGTH.

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

간단히 HttpRequest를 사용할 수 있습니다.Django 2.2 이상의 헤더.다음 예제는 요청응답 개체 섹션의 공식 장고 설명서에서 직접 가져온 것입니다.

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

파일.METAHTTP_AUTHERIZATION META.get('HTTP_AUTHERIZATION')/python3.6/site-packages/rest_framework/authentication.py

당신은 이 파일에서 그것을 얻을 수 있지만...

HTTP 헤더만 쉽게 얻을 수 있는 방법은 없다고 생각합니다.당신은 요청을 통해 반복해야 합니다.필요한 모든 것을 얻기 위한 메타 딕트.

django-messages-messages는 헤더 정보를 표시하기 위해 동일한 접근 방식을 사용합니다.헤더 정보 검색을 담당하는 이 파일을 확인합니다.

요청 헤더에서 클라이언트 키를 가져오려면 다음을 시도할 수 있습니다.

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가 있습니다.

그 출처는 당신이 하려는 일을 어떻게 성취할 것인지에 대한 꽤 좋은 참고 자료입니다.

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

머리글 키에 "_" 대신 "-"를 사용하십시오.

헤더에 "Current_User"를 사용하면 다음과 같이 얻을 수 없기 때문입니다.

request.headers.get('Current_User')   <-- None

사용자 "xxx-xxx"를 키로 지정합니다.

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