在Python中检查请求是否是AJAX

问题描述 投票:0回答:5

有没有办法在Python中检查请求是否是AJAX?

相当于PHP的

$_SERVER['HTTP_X_REQUESTED_WITH'] == 'xmlhttprequest'

python ajax http-headers xmlhttprequest
5个回答
35
投票

如果 AJAX 框架在其请求中设置了 X-Requested-With 标头,那么您将能够使用该标头来检测 AJAX 调用。这由客户端框架来完成。

获取 HTTP 标头取决于您选择的 Python 框架。在 Django 中,

request
对象有一个
is_ajax
方法
,您可以直接使用。


4
投票
自 Django 3.1(截至 2021 年 5 月 28 日)以来,

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

0
投票

检查这个如何检查涡轮齿轮中的请求是否是ajax

还有如何在 Django 中执行此操作(这取决于您的框架):如何检查传入 HTTP 标头请求的内容


0
投票

以防万一有人发现这很有用,Sec-Fetch-Dest 可以提示请求是否是 ajax 调用。

所以人们可以有这样的东西:

is_ajax_call = all(
                    request.headers.get("Sec-Fetch-Dest", "")
                    not in secFetchDest for secFetchDest in ["document", "iframe"]
                )

0
投票

从 Django 4.0 开始:

def is_ajax(request):
    return request.headers.get('x-requested-with') == 'XMLHttpRequest'

def view(request):
    if is_ajax(request):
        ...
© www.soinside.com 2019 - 2024. All rights reserved.