读取ajax中传递的自定义标头

时间:2015-10-29 11:37:13

标签: python ajax django http header

我正在django中向我的视图发送一些自定义标题,如下所示:

$.ajax({
        type: 'POST',
        url: url,
        headers: { 'x-my-custom-header': 'some value' },
        data: params,
        success:gi.payU.updatePaymentMethods
});

我正在接受请求,如下所示:

 'HTTP_REFERER': 'http://some_url/',
 'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',
 'HTTP_X_MY_CUSTOM_HEADER': 'some value',  ## <-- my value
 'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest',

在django中读取此内容的正确方法是什么?

我尝试了下面列出的多种方式,但似乎都没有:

(Pdb) request.COOKIES["HTTP_X_MY_CUSTOM_HEADER"]
*** KeyError: 'HTTP_X_MY_CUSTOM_HEADER'
(Pdb) request.X_MY_CUSTOM_HEADER
*** AttributeError: 'WSGIRequest' object has no attribute 'X_MY_CUSTOM_HEADER'
(Pdb) request.HTTP_X_MY_CUSTOM_HEADER
*** AttributeError: 'WSGIRequest' object has no attribute 'HTTP_X_MY_CUSTOM_HEADER'
(Pdb) request.http_x-my-custom-header
*** AttributeError: 'WSGIRequest' object has no attribute 'http_x'
(Pdb) request.HTTP_X_MY_CUSTOM_HEADER
*** AttributeError: 'WSGIRequest' object has no attribute 'HTTP_X_MY_CUSTOM_HEADER'
(Pdb) request["HTTP_X_MY_CUSTOM_HEADER"]
*** TypeError: 'WSGIRequest' object has no attribute '__getitem__'

它最终起作用如下:

request.META["HTTP_X_MY_CUSTOM_HEADER"] # note "HTTP_" append

问题:

我的varibale名称是a,b,c我需要追加 http到每个变量才能访问它吗?喜欢:

http_a
http_b
http_b
http_d

有没有更好的方法来访问这里我可以直接访问变量名称,就像我们根据键获取dict值一样?

1 个答案:

答案 0 :(得分:1)

对于以&#39; HTTP _&#39;为前缀的密钥,您说得对。

the docs开始,这就是Django构建密钥的方式:

  

除了CONTENT_LENGTH和CONTENT_TYPE之外,如上所述,请求中的任何HTTP头都将转换为META密钥,方法是将所有字符转换为大写,用下划线替换任何连字符,并在名称中添加HTTP_前缀。因此,例如,名为X-Bender的标头将映射到META密钥HTTP_X_BENDER。

您可以遍历所有标头并反转此过程以获取原始标头密钥。