如何在 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

Quote from the documentation:

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