django 属性错误:"WSGIRequest"对象没有属性"is_ajax"

w51jfk4q  于 2023-01-27  发布在  Go
关注(0)|答案(3)|浏览(402)

我试图学习 AJAX 在django,但当我运行这个简单的测试,我得到了这个错误,我找不到原因,我的django版本是4. 0

AttributeError: 'WSGIRequest' object has no attribute 'is_ajax'

查看.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)

网址.py

urlpatterns = [
    path('',views.home,name='home'),
    path('ajax_test/', views.ajax_test, name='ajax_test')
]

索引.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>
mwecs4sa

mwecs4sa1#

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

j13ufse22#

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

**request.is_ AJAX ()可以完全按照request.headers.get('x-请求的-with')== 'XMLHttpRequest'**的方式重新生成
Django使用的request对象类似于requests。当您的客户端使用特定的头部x-requested-with设置XMLHttpRequest时,您可以识别 AJAX 请求。

z0qdvdin

z0qdvdin3#

这个方法不应该被删除,因为jQuery是最被低估的库,在许多现代教程中仍然强烈地存在。希望有一天他们会把它带回来。
我发现同一版本的django很奇怪,在服务器部署后报告了这个错误,但从来没有在本地机器上报告过。

如果您已经在项目中实现了is_ajax,并且它的作用域很大,那么下面是一种针对每个请求实现is_ajax的方法

1.在你的任何一个应用中创建一个middlewares.py,在我的例子中,是common应用。(不管你在哪个应用中添加这个,中间件是全局调用的 Package 器函数,在视图之前或之后执行操作)

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.middleware.AjaxMiddleware', 
]

相关问题