1

我的 Django 视图中有这段代码:

if request.is_ajax():
    if request.method == 'POST':
        data = json.loads(request.raw_post_data)

我通过 CURL 发送这个请求:

curl -v -i -H "Content-Type:application/json" -H "X_REQUESTED_WITH:XMLHttpRequest" -X POST -d '{"tweet_id":"189881044923719680", "question_id":"1", "choice_one":"T", "choice_two":"F", "choice_three":"F", "extra_passback":"common cold"}' http://ec[...].compute-1.amazonaws.com/question/answer/

当我点击我的开发 Django 服务器时,这有效。在生产中,我正在运行 nginx 和 gunicorn。并且 curl 语句不起作用。

request.is_ajax() 返回 False(is_ajax 查找 x_requested_with 标头)。

我认为这可能与 NGINX 配置有关。但我不确定。我需要改变什么?

4

1 回答 1

2

尝试X_REQUESTED_WITH:XMLHttpRequest用破折号更改下划线:X-REQUESTED-WITH:XMLHttpRequest

我对 nginx 有同样的问题,因为代理X_REQUESTED_WITH从请求中删除了该字段。默认情况下,nginx 将带有下划线的标头标记为无效并忽略无效标头。

您可以使用 nginx 指令来允许标头中使用下划线underscores_in_headers on;或不忽略带有ignore_invalid_headers off;.

在我的具体案例中,我使用 python 请求作为客户端,django 作为服务器,nginx 作为代理,并解决了我重命名X_REQUESTED_WITHX-REQUESTED-WITH. (Django'HTTP_'在使标头可用之前自动添加到 x-header 名称的开头request.META.

import requests
headers = {'X-REQUESTED-WITH':'XMLHttpRequest'}
r = requests.post(url, data=payload, headers=headers)
于 2012-10-26T06:00:03.797 回答