nginx,django和x_requested_with:request.is_ajax()返回False

时间:2012-04-26 19:04:23

标签: django http nginx

我的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配置有关。但我不确定。我需要改变什么?

1 个答案:

答案 0 :(得分: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_WITH重命名为X-REQUESTED-WITH的问题。 (在'HTTP_')中提供标题之前,Django会自动将request.META.添加到x标题名称的开头

import requests
headers = {'X-REQUESTED-WITH':'XMLHttpRequest'}
r = requests.post(url, data=payload, headers=headers)