【问题标题】:Check if request is AJAX in Python检查请求是否是 Python 中的 AJAX
【发布时间】:2012-01-20 11:17:58
【问题描述】:

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

相当于PHP的$_SERVER['HTTP_X_REQUESTED_WITH'] == 'xmlhttprequest'?

【问题讨论】:

    标签: python ajax http-headers xmlhttprequest


    【解决方案1】:

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

    获取 HTTP 标头取决于您选择的 Python 框架。在 Django 中,request 对象有一个 is_ajax method 可以直接使用。

    【讨论】:

    • 在 Django 中你可以简单地做request.is_ajax()
    • 谢谢@maraujop,这容易多了!我已经更新了我的答案以匹配。
    • 这个标头不能被欺骗吗?
    • 此标头很容易被欺骗,因此请谨慎使用。从 Django 版本 3.1 开始,is_ajax() 方法也已被弃用。
    • is_ajax() 在 django 3.2 和 2021 年 5 月 28 日之前已弃用。
    【解决方案2】:

    查看how to check if request is ajax in turbogears

    这也是如何在 Django 中执行此操作的(这取决于您的框架):How to check contents of incoming HTTP header request

    【讨论】:

      【解决方案3】:

      is_ajax() 自 Django 3.1(截至 2021 年 5 月 28 日)以来已弃用,因为他们表示它依赖于 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
      

      【讨论】:

        猜你喜欢
        • 2015-05-27
        • 1970-01-01
        • 2021-06-25
        • 1970-01-01
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多