Django >= 3.1 和 is_ajax

Vis*_*hal 8 django ajax

HttpRequest.is_ajax() 从 3.1 版开始不推荐使用。

如果页面是从浏览器请求的,并且好像JsonResponse是从 javascript 或以编程方式调用的,我想返回 html 。

我正在寻求有关如何做到这一点的指导。

https://docs.djangoproject.com/en/3.1/ref/request-response/#django.http.HttpRequest.is_ajax

JPG*_*JPG 8

检查HTTP_X_REQUESTED_WITH标题

def sample_view(request):
    is_ajax = request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
Run Code Online (Sandbox Code Playgroud)

来自3.1发行说明

HttpRequest.is_ajax()方法已被弃用,因为它依赖于 jQuery 特定的表示 AJAX 调用的方式,而当前的用法倾向于使用 JavaScript Fetch API。根据您的用例,您可以编写自己的 AJAX 检测方法,或者HttpRequest.accepts()如果您的代码依赖于客户端 Accept HTTP 标头,则使用新方法。


Pau*_*sex 8

有趣的是——引用的弃用简介只能让你成功一半。弃用文本、文档和发行说明中都没有说明如何使用新HttpRequest.accepts方法”进行替换。HttpRequest.is_ajax

所以,这里是:if request.accepts("application/json")

(至少这对我有用。)


小智 6

代替:

if request.is_ajax():
Run Code Online (Sandbox Code Playgroud)

帮助过我:

if request.headers.get('x-requested-with') == 'XMLHttpRequest':
Run Code Online (Sandbox Code Playgroud)