AttributeError: 'WSGIRequest' 对象没有属性 'is_ajax'

问题描述 投票:0回答:3

我试图在 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>
django ajax xmlhttprequest
3个回答
37
投票

来自 3.1 的发行说明

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

10
投票

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

我发现对于相同版本的 django 很奇怪,在服务器部署后报告了这个错误,但从来没有在本地机器上。

如果您已经在您的项目中实施

is_ajax
,并且它的范围很大,这里有一种方法可以对每个请求实施
is_ajax

  1. 在您的任何应用程序中创建一个
    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
方法。

  1. 插入
    settings.py
MIDDLEWARE = [
    'common.middlewares.AjaxMiddleware', 
]

8
投票

根据3.1的release notes完成JPG

答案

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

Django
使用的request对象就像requests。当您的客户端使用特定标头
x-requested-with
设置为
XMLHttpRequest
.

时,您可以识别 AJAX 请求
© www.soinside.com 2019 - 2024. All rights reserved.