source

AttributeError: 'WSGIRquest' 개체에 'is_ajax' 속성이 없습니다.

manysource 2023. 9. 27. 18:01

AttributeError: 'WSGIRquest' 개체에 'is_ajax' 속성이 없습니다.

나는 장고에서 아약스를 배우려고 노력하고 있지만 이 간단한 테스트를 실행했을 때 이 오류가 발생했고 이유를 찾을 수 없습니다. 내 장고 버전은 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')
]

색인을 보다

<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의 릴리스 노트에서

HttpRequest.is_ajax()메서드는 jQuery 특유의 AJAX 호출을 나타내는 방법에 의존했기 때문에 더 이상 사용되지 않는 반면 현재 사용은 JavaScript Fetch API를 사용하는 경향이 있습니다.사용 사례에 따라 AJAX 탐지 방법을 직접 작성하거나 새로운HttpRequest.accepts()코드가 클라이언트 Accept HTTP 헤더에 의존하는 경우 method.

감가상각이 되었지만, 다음과 같이 요청유형을 확인할 수 있는 사용자 정의 기능을 만들 수 있습니다.

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요망이 있을 때마다

  1. 창조하다, 창안middlewares.py당신의 어떤 앱이든, 내 경우엔commonapp. (이것을 어떤 앱에 추가하든 상관없이 미들웨어는 보기 전 또는 후 작업을 수행하기 위해 글로벌하게 호출되는 래퍼 기능입니다.)
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

이것은 a를 정의할 것입니다.is_ajax보기에서 수신하기 전에 모든 요청에 대해 메서드를 지정합니다.

  1. 이 플러그를 꽂습니다.settings.py:
MIDDLEWARE = [
    'common.middlewares.AjaxMiddleware', 
]

3.1의 릴리스 노트를 바탕으로 JPG 답변 작성

request.is _ ajax()(는) 요청에 따라 정확히 재생성할 수 있습니다.headers.get ('x- requested-with') == 'XMLHtpRequest'

request장고가 사용하는 객체는 요청과 같습니다.클라이언트가 특정 헤더를 사용할 때 AJAX 요청을 식별할 수 있습니다.x-requested-with을 세트로 하다XMLHttpRequest.

언급URL : https://stackoverflow.com/questions/70419441/attributeerror-wsgirequest-object-has-no-attribute-is-ajax