我试图在 Django 中学习 ajax 但是当我运行这个简单的测试时我得到了这个错误而且我找不到原因, 我的 django 版本是 4.0
AttributeError: 'WSGIRequest' object has no attribute 'is_ajax'
view.py
from django.shortcuts import render, HttpResponse
def home(request):
return render(request,'myapp/index.html')
def ajax_test(request):
if request.is_ajax():
message = "This is ajax"
else:
message = "Not ajax"
return HttpResponse(message)
urls.py
urlpatterns = [
path('',views.home,name='home'),
path('ajax_test/', views.ajax_test, name='ajax_test')
]
index.html
<button id="btn">click me!</button>
<script>
$("#btn").click(function () {
$.ajax({
type: "GET",
url: "{% url 'ajax_test' %}",
success: function () {
console.log("done");
},
error: function () {
console.log("error");
},
});
});
</script>
来自 3.1 的发行说明
方法已弃用,因为它依赖于特定于 jQuery 的方式来表示 AJAX 调用,而当前的使用倾向于使用 JavaScript Fetch API。根据您的用例,您可以编写自己的 AJAX 检测方法,或者如果您的代码依赖于客户端接受 HTTP 标头,则使用新的HttpRequest.is_ajax()
方法。HttpRequest.accepts()
即使它已被弃用,您也可以创建一个自定义函数来检查请求类型,
def is_ajax(request):
return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
并在您认为的任何地方使用,
from django.shortcuts import HttpResponse
def is_ajax(request):
return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
def ajax_test(request):
if is_ajax(request=request):
message = "This is ajax"
else:
message = "Not ajax"
return HttpResponse(message)
这个方法不应该被删除,因为 jQuery 是最被低估的库,在许多现代教程中仍然强烈存在。希望有一天他们会把它带回来。
我发现对于相同版本的 django 很奇怪,在服务器部署后报告了这个错误,但从来没有在本地机器上。
如果您已经在您的项目中实施
is_ajax
,并且它的范围很大,这里有一种方法可以对每个请求实施is_ajax
middlewares.py
,在我的例子中,common
应用程序。 (你在哪个应用程序中添加它并不重要,中间件是全局调用的包装函数,用于在查看之前或之后执行操作)class AjaxMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
def is_ajax(self):
return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
request.is_ajax = is_ajax.__get__(request)
response = self.get_response(request)
return response
这将在每个请求被视图接收之前定义一个
is_ajax
方法。
settings.py
:MIDDLEWARE = [
'common.middlewares.AjaxMiddleware',
]