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)
8条答案
按热度按时间2eafrhcq1#
检查
HTTP_X_REQUESTED_WITH
标题来自3.1的发行说明
HttpRequest.is_ajax()
方法已被弃用,因为它依赖于特定于jQuery的方式来表示 AJAX 调用,而当前的使用倾向于使用JavaScript Fetch API。根据您的使用情况,您可以编写自己的AJAX检测方法,或者如果您的代码依赖于客户端Accept HTTP标头,则使用新的HttpRequest.accepts()
方法。jecbmhm32#
取代:
帮了我:
6fe3ivhb3#
有趣的是--引用的弃用简介只说明了一半,没有任何迹象表明 * 如何 *“使用新的
HttpRequest.accepts
方法”来替换HttpRequest.is_ajax
--弃用文本、文档和发行说明中都没有。所以,这就是:
if request.accepts("application/json")
(At至少这对我有效。)
byqmnocz4#
你试过检查HttpRequest. header吗?
HttpRequest.is_ AJAX ()依赖于HTTP_X_REQUESTED_WITH报头。
所以你可以检查这个头,如果它是真的,它将是 AJAX ,否则它将是一个来自浏览器的请求。
4ngedf3f5#
我做了arakkal-abu所说的,但我也添加了具有相同值的
'X-Requested-With'
头文件,即'XMLHttpRequest'
我的要求,它的工作
bjp0bcyl6#
确保在顶部导入此内容
您可以在函数/方法中使用它来确定是从浏览器还是ajax调用
解释
如果您请求从浏览器加载一个页面,您会在网络选项卡中该请求的请求标头下看到,
text/html
位于requested headers
的开头。但是,如果您从浏览器进行ajax调用,则
requested headers
在开始时具有*/*
。在报头中,则请求的报头变为
从这里,您可以理解在这些情况下接受头是如何不同的。
x7yiwoj47#
只需检查
Content-Type
标头。a7qyws3x8#
将这些建议结合在一起对我们的使用案例有效...
然后将
request.is_ajax()
的所有示例替换为is_ajax(request)
。