如何在 Django Rest Framework 上访问自定义 HTTP 请求 headers?
How to access custom HTTP request headers on Django Rest Framework?
我正在向我的 API 发送一个 post 请求,使用 django rest 框架:
curl --header "X-MyHeader: 123" --data "test=test" http://127.0.0.1:8000/api/update_log/
在我的休息框架视图中,我想获取我的服装 header,如果定制 header 满足条件,我将继续分析我的 post 数据。
好的,我的观点是这样的:
class PostUpdateLogView(APIView):
throttle_classes = ()
permission_classes = ()
parser_classes = (
parsers.FormParser,
parsers.MultiPartParser,
parsers.JSONParser,
)
renderer_classes = (renderers.JSONRenderer,)
def post(self, request):
print request.Meta
# Get custom header
# Validate custom header
# Proceed to analize post data
# Make response
content = {
'response': 'response',
}
return Response(content)
我试图在 request.Meta 元素上找到我的自定义 header,但是当我打印 request.Meta 时,出现 500 错误。如果我打印 request.data,我会得到预期的响应。
¿使用 django rest 框架在我的 post 请求中获得自定义 header 的方法是什么?
请求的元数据属性名称大写:
print request.META
如果您的 header 名为“My-Header”,您的 header 将可用为:
request.META['HTTP_MY_HEADER']
或:
request.META.get('HTTP_MY_HEADER') # return `None` if no such header
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
.
如果您提供了有效的 header 信息并从后端获取该信息,那么请遵循这些
client-name='ABCKD'
那么您已经在 post 中获取了该客户信息,或者在这之后获取了函数-
request.META['HTTP_CLIENT_NAME']
它会给你输出 'ABCKD'.
请记住,无论您在请求的 header 信息中提供的有效变量名是什么,django 都会将其转换为大写并加上前缀 'HTTP_
'
在这里它将 client-name 转换为 CLIENT_NAME
并加上前缀 HTTP_
。
所以最终输出是 HTTP_CLIENT_NAME
看到这是一个旧的 post,我想我会分享自 Django 2.2 以来可用的更新和更灵活的方法。您可以使用 request's headers object:
# curl --header "X-MyHeader: 123" --data "test=test" http://127.0.0.1:8000/api/update_log/
request.headers['X-MYHEADER'] # returns "123"
request.headers['x-myheader'] # case-insensitive, returns the same
request.headers.get('x-myheader') # returns None if header doesn't exist
# standard headers are also available here
request.headers.get('Content-Type') # returns "application/x-www-form-urlencoded"
与 request.META
的最大区别在于 request.headers
不会在 header 前面添加 HTTP_
,它不会转换 header 名称UPPER_SNAKE_CASE
并且 header 可以访问 case-insensitively。它只会在显示时将 header 转换为 Title-Casing
(例如 X-Myheader
)。
我正在向我的 API 发送一个 post 请求,使用 django rest 框架:
curl --header "X-MyHeader: 123" --data "test=test" http://127.0.0.1:8000/api/update_log/
在我的休息框架视图中,我想获取我的服装 header,如果定制 header 满足条件,我将继续分析我的 post 数据。
好的,我的观点是这样的:
class PostUpdateLogView(APIView):
throttle_classes = ()
permission_classes = ()
parser_classes = (
parsers.FormParser,
parsers.MultiPartParser,
parsers.JSONParser,
)
renderer_classes = (renderers.JSONRenderer,)
def post(self, request):
print request.Meta
# Get custom header
# Validate custom header
# Proceed to analize post data
# Make response
content = {
'response': 'response',
}
return Response(content)
我试图在 request.Meta 元素上找到我的自定义 header,但是当我打印 request.Meta 时,出现 500 错误。如果我打印 request.data,我会得到预期的响应。
¿使用 django rest 框架在我的 post 请求中获得自定义 header 的方法是什么?
请求的元数据属性名称大写:
print request.META
如果您的 header 名为“My-Header”,您的 header 将可用为:
request.META['HTTP_MY_HEADER']
或:
request.META.get('HTTP_MY_HEADER') # return `None` if no such header
HTTP headers in the request are converted to
META
keys by converting all characters to uppercase, replacing any hyphens with underscores and adding anHTTP_
prefix to the name. So, for example, a header calledX-Bender
would be mapped to theMETA
keyHTTP_X_BENDER
.
如果您提供了有效的 header 信息并从后端获取该信息,那么请遵循这些
client-name='ABCKD'
那么您已经在 post 中获取了该客户信息,或者在这之后获取了函数-
request.META['HTTP_CLIENT_NAME']
它会给你输出 'ABCKD'.
请记住,无论您在请求的 header 信息中提供的有效变量名是什么,django 都会将其转换为大写并加上前缀 'HTTP_
'
在这里它将 client-name 转换为 CLIENT_NAME
并加上前缀 HTTP_
。
所以最终输出是 HTTP_CLIENT_NAME
看到这是一个旧的 post,我想我会分享自 Django 2.2 以来可用的更新和更灵活的方法。您可以使用 request's headers object:
# curl --header "X-MyHeader: 123" --data "test=test" http://127.0.0.1:8000/api/update_log/
request.headers['X-MYHEADER'] # returns "123"
request.headers['x-myheader'] # case-insensitive, returns the same
request.headers.get('x-myheader') # returns None if header doesn't exist
# standard headers are also available here
request.headers.get('Content-Type') # returns "application/x-www-form-urlencoded"
与 request.META
的最大区别在于 request.headers
不会在 header 前面添加 HTTP_
,它不会转换 header 名称UPPER_SNAKE_CASE
并且 header 可以访问 case-insensitively。它只会在显示时将 header 转换为 Title-Casing
(例如 X-Myheader
)。