如何使用python获取客户端在请求头中插入的新参数?

2024-03-28 11:29:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个卷曲请求,如下所示:

curl --location --request POST 'http://127.0.0.1:8000/hit_api/' \
--header 'x-access-token: xxxx' \
--header 'HTTP_APP: "abcd123"'

现在我想从请求者插入的HTTP_APP参数中获取字符串:abcd123

我试过:

print(request.META)
    
if "HTTP_APP" not in request.META:

   return JsonResponse({
     'success': False,
     'message': 'HTTP_APP not found in Headers'
   })

我只得到上面的JsonResponse,因为它没有从标题中打印HTTP_APP

request.META输出:

{'TMPDIR': '/var/folders/07//T/', 'XPC_FLAGS': '0x0', 'TERM_PROGRAM_VERSION': '433', 'TERM_PROGRAM': 'Apple_Terminal', 'XPC_SERVICE_NAME': '0', 'TERM_SESSION_ID': '63385300-42FE-4D88-862B-6A55FD4FE263', 'TERM': 'xterm-256color', '
SSH_AUTH_SOCK': '/private/tmp/com.apple.launchd.bLmUMoeIe0/Listeners', 'SHELL': '/bin/zsh', 'HOME': '/Users/servify', 'LOGNAME': '', 'USER': '', 'PATH': '/Users/servify/Desktop/virtualenvs/crackdenv/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', 'SHLVL': '1', 'PWD': '/Users/servify/Desktop/crackd-api', 'OLDPWD': '/Users/Desktop/virtualenvs', 'VIRTUAL_ENV': '/Users/servify/Desktop/virtualenvs/abcenv, 'PS1': '(crackdenv) %n@%m %1~ %# ', 'ABC_ENV': 'development', 'LC_CTYPE': 'UTF-8', '
_': '/Users/servify/Desktop/virtualenvs/abcenv/bin/python', '__CF_USER_TEXT_ENCODING': '0x1F6:0x0:0x0', '__PYVENV_LAUNCHER__': '/Users/Desktop/virtualenvs/crackdenv/bin/python', 'DJANGO_SETTINGS_MODULE': 'server.settings', 'TZ': 'UTC', 'RUN_MAIN': 'true', 'SERVER_NAME': '1.0.0.127.in-addr.arpa', 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8000', 'REMOTE_HOST': '', 'CONTENT_LENGTH': '0', 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.2', 'REQUEST_METHOD': 'POST', 'PATH_INFO': '/get_config/', 'QUERY_STRING': '', 'REMOTE_ADDR': '127.0.0.1', 
'CONTENT_TYPE': 'text/plain', 'HTTP_X_ACCESS_TOKEN': '', 'HTTP_USER_AGENT': 'PostmanRuntime/7.26.1', 'HTTP_ACCEPT': '*/*', 'HTTP_POSTMAN_TOKEN': '', 'HTTP_HOST': '127.0.0.1:8000', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_CONNECTION': 'keep-alive', 'wsgi.input': <_io.BufferedReader name=11>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>}

我正在使用Django 2.1.2,因此无法根据文档使用request.headershttps://docs.djangoproject.com/en/3.0/ref/request-response/#attributes

有人可以指导我如何获取自定义标题参数吗

谢谢


Tags: nameinfalseapphttpwsgibinserver
1条回答
网友
1楼 · 发布于 2024-03-28 11:29:17

如果您使用的是django cors headers库,则必须首先允许自定义头,否则它们将被忽略。 将此添加到您的设置文件中

from corsheaders.defaults import default_headers
CORS_ALLOW_HEADERS = list(default_headers) + [
    'X-AUTHORIZATION-KEY',  # whatever your header name is add here(without prefixing HTTP)
]

这里也有记录- https://docs.djangoproject.com/en/2.1/ref/request-response/#django.http.HttpRequest.META

With the exception of CONTENT_LENGTH and CONTENT_TYPE, as given above, any HTTP headers in the request are converted to META keys by converting all characters to uppercase, replacing any hyphens with underscores and adding an HTTP_ prefix to the name. So, for example, a header called X-Bender would be mapped to the META key HTTP_X_BENDER.

假设您的头名为“X-AUTHORIZATION-KEY”,您将仅从curl/postman请求发送“X-AUTHORIZATION-KEY”,并在django代码中检查request_meta.get('HTTP_X_AUTHORIZATION_KEY')

相关问题 更多 >