首页 > 解决方案 > Django Ajax 通信,Django 不识别为 Ajax(使用 request.is_ajax() )

问题描述

我在 Django 中使用 Ajax。数据被进一步传输,但不被识别为 Ajax。浏览器 Chrome/Firefox;

要检查请求是否通过 ajax 完成,我使用:

`request.is_ajax()` method, but this fails, not true, so I checked this method how is working and:

def is_ajax(self):
    return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'

我验证了 META.get('HTTP_X_REQUESTED_WITH'),我得到了None

我认为是 ContentType 或者我需要设置另一个标题。但是如何?我的 JavaScript 是这样设置的:

xhr.open('post', event.target.action, true);
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("HTTP_X_REQUESTED_WITH", "XMLHttpRequest");
        xhr.send(data));

进一步检查似乎 request.Meta 也不包含 Content-type 。

标签: javascriptajaxdjango

解决方案


从官方文档

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

所以标题的名称应该是X-Requested-With

xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

推荐阅读