AttributeError:“WSGIRequest”对象没有属性“is_ajax”

Rox*_*ana 21 django ajax xmlhttprequest

我试图在 django 中学习 ajax 但是当我运行这个简单的测试时我得到了这个错误并且我找不到原因,我的 django 版本是 4.0

AttributeError: 'WSGIRequest' object has no attribute 'is_ajax'
Run Code Online (Sandbox Code Playgroud)

视图.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)
Run Code Online (Sandbox Code Playgroud)

urls.py

urlpatterns = [
    path('',views.home,name='home'),
    path('ajax_test/', views.ajax_test, name='ajax_test')
]
Run Code Online (Sandbox Code Playgroud)

索引.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>
Run Code Online (Sandbox Code Playgroud)

JPG*_*JPG 44

来自3.1 的发行说明

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

即使它已被弃用,您也可以创建一个自定义函数来检查请求类型,如下所示:

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

并在您认为的任何地方使用,

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)
Run Code Online (Sandbox Code Playgroud)


Mes*_*Qin 17

这个方法不应该被删除,因为 jQuery 是最被低估的库,在许多现代教程中仍然存在。希望有一天他们会把它带回来。

我发现对于相同版本的 django 来说很奇怪,在服务器部署后报告了此错误,但从未在本地计算机中报告。

如果您已在项目中实施is_ajax,并且范围很大,那么这里有一种方法可以实现is_ajax每个请求

  1. middlewares.py在您的任何应用程序中创建一个,在我的例子中,common是 app. (无论您将其添加到哪个应用程序中,中间件都是全局调用的包装函数,用于在视图之前或之后执行操作)
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
Run Code Online (Sandbox Code Playgroud)

is_ajax这将在视图接收到每个请求之前定义一个方法。

  1. 将其插入settings.py
MIDDLEWARE = [
    'common.middlewares.AjaxMiddleware', 
]
Run Code Online (Sandbox Code Playgroud)

  • 它应该是'common.middlewares.AjaxMiddleware', (2认同)

Buk*_*uky 11

根据3.1的发行说明完成JPG答案

request.is_ajax()可以完全复制为request.headers.get('x-requested-with') == 'XMLHttpRequest'

Djangorequest使用的对象类似于requests。当您的客户端使用带有的特定标头集时,您可以识别 AJAX 请求。x-requested-withXMLHttpRequest