【发布时间】:2013-01-17 10:33:19
【问题描述】:
我为 URL 签名使用了一个自定义的 http 标头,称为“sign”,如何在 Django 中获取这样的自定义 HTTP 标头值?
【问题讨论】:
标签: django
我为 URL 签名使用了一个自定义的 http 标头,称为“sign”,如何在 Django 中获取这样的自定义 HTTP 标头值?
【问题讨论】:
标签: django
继续使用:
request.META.get('HTTP_{your uppercased header name}')
请注意,在 Django 中,您使用大写字母而不是破折号来编写标头名称,但是在客户端的请求中您必须使用破折号而不是下划线来编写它(生产网络服务器将删除带有下划线的自定义标头以确保安全原因)。
因此,自定义标头My-Custom-Header 被访问request.META['HTTP_MY_CUSTOM_HEADER']
【讨论】:
我终于找到了通过它
request.META('HTTP_{your uppercased header name}')
【讨论】:
TypeError: 'dict' object is not callable。调用request.META.get('HTTP_{your uppercased header name}') 是正确的方法。
您可以将自己的自定义标头添加到响应中,如下所示: https://docs.djangoproject.com/en/dev/ref/request-response/#setting-headers
>>> response = HttpResponse()
>>> response['Cache-Control'] = 'no-cache'
>>> del response['Cache-Control']
或者使用装饰器将它们添加到视图中: http://djangosnippets.org/snippets/275/
【讨论】:
我试图使用以下代码访问带有上述答案的标题:
request.META.get('HTTP_{your uppercased header name}')
但这对我不起作用,然后我意识到自定义标头不应该包含 underscore 所以我将 underscore 更改为 dash 并且繁荣,一切都开始工作了。希望这会帮助像我这样的人。 :-)
【讨论】:
从 Django 2.2 开始,您可以使用 HttpRequest.headers 字典,它提供不区分大小写的请求标头字典,如下所示:
my_header = request.headers.get('x-my-custom-header')
【讨论】:
来自 Django 文档:
https://docs.djangoproject.com/en/2.1/ref/request-response/#django.http.HttpRequest.META
如上所述,除了 CONTENT_LENGTH 和 CONTENT_TYPE, 请求中的任何 HTTP 标头都通过以下方式转换为 META 键 将所有字符转换为大写,将任何连字符替换为 下划线并在名称中添加 HTTP_ 前缀。所以,例如, 一个名为 X-Bender 的标头将映射到 META 键 HTTP_X_BENDER。
【讨论】: