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