source

장고 >= 3.1 및 is_dll

ittop 2023. 8. 15. 11:43
반응형

장고 >= 3.1 및 is_dll

HttpRequest.is_ajax()버전 3.1부터는 더 이상 사용하지 않습니다.

브라우저에서 페이지를 요청하면 html을 반환하고 싶습니다.JsonResponse자바스크립트 또는 프로그래밍 방식으로 호출되는 경우.

나는 그것을 하는 방법에 대한 지침을 찾고 있습니다.

https://docs.djangoproject.com/en/3.1/ref/request-response/ #django.http.HttpRequest.is _http://ajax

확인.HTTP_X_REQUESTED_WITH머리말

def sample_view(request):
    is_ajax = request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'

3.1 릴리스 정보

HttpRequest.is_ajax()메소드는 JQuery 고유의 AJAX 호출을 나타내는 방식에 의존했기 때문에 더 이상 사용되지 않으며, 현재 사용되는 방식은 JavaScript Fetch API를 사용하는 경향이 있습니다.사용 사례에 따라 고유한 AJAX 탐지 방법을 작성하거나 새 AJAX 탐지 방법을 사용할 수 있습니다.HttpRequest.accepts()코드가 클라이언트 HTTP 수락 헤더에 의존하는 경우 메서드입니다.

재미있는 것은 -- 인용된 비망록은 여러분을 반 정도 밖에 못 가게 합니다."새 제품을 어떻게 사용하는지"에 대한 표시가 없습니다.HttpRequest.accepts메소드"를 바꿀 수 있습니다.HttpRequest.is_ajax사용하지 않는 텍스트, 설명서 또는 릴리스 노트에 없습니다.

자, 여기 있습니다.if request.accepts("application/json")

(적어도 그것이 저에게 효과가 있었습니다.)

다음 대신:

if request.is_ajax():

도움이 되었습니다.

if request.headers.get('x-requested-with') == 'XMLHttpRequest':

제안을 결합하면 사용 사례에 효과가 있습니다.

def is_ajax(request: django.http.request.HttpRequest) -> bool:
    """
    https://stackoverflow.com/questions/63629935
    """
    return (
        request.headers.get('x-requested-with') == 'XMLHttpRequest'
        or request.accepts("application/json")
    )

그런 다음 의 모든 인스턴스를 바꿉니다.request.is_ajax()와 함께is_ajax(request).

HttpRequest를 확인해 보셨습니까?머리글?
HttpRequest.is _requested는 HTTP_X_REQUESTED_에 의존합니다.머리글 포함.
그래서 당신은 이 헤더를 확인할 수 있습니다. 만약 그것이 사실이라면 그것은 AJAX일 것이고 그렇지 않으면 그것은 브라우저로부터의 요청일 것입니다.

HttpRequest.headers['HTTP_X_REQUESTED_WITH']

나는 아라크칼아부가 말한 대로 했지만, 나는 또한 덧붙였습니다.'X-Requested-With'동일한 값을 가진 헤더.'XMLHttpRequest'

내 요청에 따라 그것은 효과가 있었습니다.

맨 위에 있는 것을 가져와야 합니다.

import re
from django.http import JsonResponse
from django.utils.translation import gettext_lazy as _
from django.conf.urls import handler404

브라우저 또는 Ajax 호출 중 어느 것을 사용하는지 확인하기 위해 함수/메소드 내에 이 정보를 포함할 수 있습니다.

    requested_html = re.search(r'^text/html', request.META.get('HTTP_ACCEPT'))
    if requested_html:
        # requested from browser, do as per your wish
    # ajax call. Returning as per wish 
    return JsonResponse({
        'detail': _('Requested API URL not found')
    }, status=404, safe=False)

설명.

브라우저에서 페이지를 로드하도록 요청하면 네트워크 탭에서 해당 요청의 요청된 헤더 아래에 표시됩니다.text/html의 시작 부분에 있습니다.requested headers. enter image description here

그러나 브라우저에서 Ajax를 호출하는 경우requested headers가지다*/*태초에첨부하는 경우

Accept: application/json

헤더에서 요청된 헤더는 다음과 같습니다.

이를 통해 승인 헤더가 이러한 경우에 어떻게 다른지 이해할 수 있습니다.

언급URL : https://stackoverflow.com/questions/63629935/django-3-1-and-is-ajax

반응형