Django>= 3.1并且是 AJAX

iovurdzv  于 2022-12-24  发布在  Go
关注(0)|答案(8)|浏览(132)

HttpRequest.is_ajax()从3.1版开始不建议使用。
如果页面是从浏览器请求的,我希望返回html,如果从javascript或编程方式调用,我希望返回JsonResponse
我正在寻求如何做到这一点的指导。
https://docs.djangoproject.com/en/3.1/ref/request-response/#django.http.HttpRequest.is_ajax

2eafrhcq

2eafrhcq1#

检查HTTP_X_REQUESTED_WITH标题

def sample_view(request):
    is_ajax = request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'

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

jecbmhm3

jecbmhm32#

取代:

if request.is_ajax():

帮了我:

if request.headers.get('x-requested-with') == 'XMLHttpRequest':
6fe3ivhb

6fe3ivhb3#

有趣的是--引用的弃用简介只说明了一半,没有任何迹象表明 * 如何 *“使用新的HttpRequest.accepts方法”来替换HttpRequest.is_ajax--弃用文本、文档和发行说明中都没有。
所以,这就是:if request.accepts("application/json")
(At至少这对我有效。)

byqmnocz

byqmnocz4#

你试过检查HttpRequest. header吗?

HttpRequest.is_ AJAX ()依赖于HTTP_X_REQUESTED_WITH报头。

所以你可以检查这个头,如果它是真的,它将是 AJAX ,否则它将是一个来自浏览器的请求。

HttpRequest.headers['HTTP_X_REQUESTED_WITH']
4ngedf3f

4ngedf3f5#

我做了arakkal-abu所说的,但我也添加了具有相同值的'X-Requested-With'头文件,即'XMLHttpRequest'
我的要求,它的工作

bjp0bcyl

bjp0bcyl6#

确保在顶部导入此内容

import re
from django.http import JsonResponse
from django.utils.translation import gettext_lazy as _
from django.conf.urls import handler404

您可以在函数/方法中使用它来确定是从浏览器还是ajax调用

requested_html = re.search(r'^text/html', request.META.get('HTTP_ACCEPT'))
    if requested_html:
        # requested from browser, do as per your wish
    # ajax call. Returning as per wish 
    return JsonResponse({
        'detail': _('Requested API URL not found')
    }, status=404, safe=False)

解释

如果您请求从浏览器加载一个页面,您会在网络选项卡中该请求的请求标头下看到,text/html位于requested headers的开头。

但是,如果您从浏览器进行ajax调用,则requested headers在开始时具有*/*

Accept: application/json

在报头中,则请求的报头变为

从这里,您可以理解在这些情况下接受头是如何不同的。

x7yiwoj4

x7yiwoj47#

只需检查Content-Type标头。

is_ajax = request.META.get("CONTENT_TYPE") == "application/json"
if is_ajax:
    do_stuff()
a7qyws3x

a7qyws3x8#

将这些建议结合在一起对我们的使用案例有效...

def is_ajax(request: django.http.request.HttpRequest) -> bool:
    """
    https://stackoverflow.com/questions/63629935
    """
    return (
        request.headers.get('x-requested-with') == 'XMLHttpRequest'
        or request.accepts("application/json")
    )

然后将request.is_ajax()的所有示例替换为is_ajax(request)

相关问题