有没有办法在Python中检查请求是否是AJAX?
相当于PHP的
$_SERVER['HTTP_X_REQUESTED_WITH'] == 'xmlhttprequest'
?
如果 AJAX 框架在其请求中设置了 X-Requested-With 标头,那么您将能够使用该标头来检测 AJAX 调用。这由客户端框架来完成。
获取 HTTP 标头取决于您选择的 Python 框架。在 Django 中,
request
对象有一个 is_ajax
方法,您可以直接使用。
is_ajax()
已被弃用,因为他们表示它取决于发送请求的 jQuery 方式,但由于人们大量使用 fetch
方法来进行 Ajax 调用,因此它在以下方面变得不可靠很多情况。
通常,当浏览器刚加载页面时,会在浏览器第一个选项的标题中请求
text/html
。但是,如果您进行API调用,那么默认情况下它会变成*/*
,如果您在标题中附加Accept: application/json
,那么它就会变成
application/json
所以,你可以通过这个轻松检查请求是否来自ajax
import re # make sure to import this module at the top
在你的职能中
requested_html = re.search(r'^text/html', request.META.get('HTTP_ACCEPT'))
if not requested_html:
# ajax request it is
还有如何在 Django 中执行此操作(这取决于您的框架):如何检查传入 HTTP 标头请求的内容
以防万一有人发现这很有用,Sec-Fetch-Dest 可以提示请求是否是 ajax 调用。
所以人们可以有这样的东西:
is_ajax_call = all(
request.headers.get("Sec-Fetch-Dest", "")
not in secFetchDest for secFetchDest in ["document", "iframe"]
)
从 Django 4.0 开始:
def is_ajax(request):
return request.headers.get('x-requested-with') == 'XMLHttpRequest'
def view(request):
if is_ajax(request):
...