bestsource

403 Django 프레임워크에서 ajax Post 요청을 할 때 금지된 오류 발생

bestsource 2023. 3. 20. 23:22
반응형

403 Django 프레임워크에서 ajax Post 요청을 할 때 금지된 오류 발생

저는 Jquery를 Django 프레임워크로 만들고 있는 웹 어플리케이션에 통합하려고 합니다. 것을 하다.ajax다음과 같습니다.htmljavascriptjavascript

<script type="text/javascript">
$(document).ready(function() {
$( "#target" ).submit(function() {
console.log('Form was submitted');
$.ajax({
        type: "POST",
        url: "/hello/",  // or just url: "/my-url/path/"
        data: {
            query: $( "#query" ).val()   
        },
        success: function(data) {
            console.log(data);
        }
    });
return false;
  });   
  })
</script>
<form id="target" action="." method="post">{% csrf_token %}
 <input id= "query" type="text" value="Hello there">
 <input type="submit" value="Search Recent Tweets">
</form>

★★★views.py아약스

 from django.core.context_processors import csrf
 from django.shortcuts import render_to_response
 from django.template.loader import get_template
 from django.template import Context,RequestContext
 from django.views.decorators.csrf import ensure_csrf_cookie
 from django.http import HttpResponse

 # access resource
 def hello(request):
  c = {}
  c.update(csrf(request))
  if request.is_ajax():
        t = get_template('template.html')
        #html = t.render(Context({'result': 'hello world'}))
        con = RequestContext(request, {'result': 'hello world'})
        return render_to_response('template.html', c, con)
  else:
        return HttpResponse('Not working!') 

사이트요청 위조 방지에 대한 공식 문서를 따르려고 노력했으며, 이와 유사한 문제에 대처하는 스택 오버플로우 질문도 몇 가지 살펴보았습니다.다음 항목을 포함했습니다.{% csrf_token %} 집에서는html템플릿 파일은 정상적으로 동작하지 않는 것 같습니다.콘솔에 Ajax 콜이 실패했음을 나타내는 오류가 나타납니다.

POST http://127.0.0.1:8000/hello/ 403 (FORBIDDEN)   

합격할 수 있나요?result하도록 할 수 ?어떤 도움이라도 깊이 감사드립니다.

편집-1

난 아마 그 차를 지나가지 않았을 거야csrf토큰을 첨부합니다.자바스크립트

function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
    var cookies = document.cookie.split(';');
    for (var i = 0; i < cookies.length; i++) {
        var cookie = jQuery.trim(cookies[i]);
        // Does this cookie string begin with the name we want?
        if (cookie.substring(0, name.length + 1) == (name + '=')) {
            cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
            break;
        }
    }
}
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');
console.log(csrftoken);

//Ajax call
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    crossDomain: false, // obviates need for sameOrigin test
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type)) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

하면 html 페이지가 .null되어 있지 되어 있지 않음을 .가가무 엇뜨 ?뜨? ???

csrfmiddlewaretoken을 올리지 않았기 때문에, 장고에서는 금지하고 있습니다.이 문서는 도움이 됩니다.

게으름뱅이들을 위해:

첫 번째 다운로드 쿠키 : http://plugins.jquery.com/cookie/

html에 추가합니다.

<script src="{% static 'designer/js/jquery.cookie.js' %}"></script>

이것으로, 동작중의 POST 요구를 작성할 수 있습니다.

var csrftoken = $.cookie('csrftoken');

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

$.ajax(save_url, {
    type : 'POST',
    contentType : 'application/json',
    data : JSON.stringify(canvas),
    success: function () {
        alert("Saved!");
    }

})

js를 템플릿에 포함하지 않는 경우 가장 빠른 해결책은 다음과 같습니다.

놓다를 <script type="text/javascript"> window.CSRF_TOKEN = "{{ csrf_token }}"; </script>script에 "script.disc" 파일을 합니다.csrfmiddlewaretoken의 에 your에data★★★★

$.ajax({
            type: 'POST',
            url: somepathname + "do_it/",
            data: {csrfmiddlewaretoken: window.CSRF_TOKEN},
            success: function() {
                console.log("Success!");
            }
        })

하면 다음과 같이data: {csrfmiddlewaretoken: '{{ csrf_token }}'}

나는 모든 이전의 답을 현장에서 찾지만 상황을 고려해 보자.

403의 금지 응답은 CSRF 미들웨어에서 발신됩니다(사이트요구 위조 방지 참조).

기본적으로는 CsrfViewMiddleware가 수행한 체크에 착신 요구가 실패하면 사용자에게 '403 금지' 응답이 전송됩니다.

다양한 옵션을 사용할 수 있습니다.@fivef의 답변을 따라 jQuery가 다음을 추가하도록 권장합니다.X-CSRFToken모든 AJAX 요구 앞에 있는 헤더$.ajaxSetup.

이 응답에는 cookie jQuery 플러그인이 필요합니다.이것이 바람직하지 않을 경우 다음 사항을 추가할 수 있습니다.

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

단, 설정이 True로 설정되어 있는 경우(보통 보안 미들웨어가 권장하는 경우)에는 쿠키가 존재하지 않습니다.@ensure_csrf_cookie()사용됩니다.이 경우{% csrf_token %}모든 형태로 제공되어야 합니다.이것에 의해, 다음과 같은 출력이 생성됩니다.<input name="csrfmiddlewaretoken" value="cr6O9...FUXf6" type="hidden">그래서...csrfToken변수는 다음 방법으로 얻을 수 있습니다.

var csrftoken = $('input[name="csrfmiddlewaretoken"]').val();

다시.$.ajaxSetup물론 필요합니다.

사용 가능하지만 권장되지 않는 다른 옵션은 다음과 같은 특정 폼에 대해 미들웨어 또는 CSRF 보호를 비활성화하는 것입니다.@csrf_exempt().

data: {"csrfmiddlewaretoken" : "{{csrf_token}}"}

「csrfmiddlewaretoken」파라미터가 송신되지 않기 때문에, 「403(FORbidden)」이라고 표시됩니다.템플릿의 각 폼에는 다음과 같은 것이 있습니다.{ % csrf _ token % } 。"csrfmiddlewaretoken"을 ajax 데이터 사전에 추가해야 합니다.이 예에서는 "product_code" 및 "csrfmiddlewaretoken"을 앱 "basket" 뷰 "remove"로 보냅니다.

$(function(){
    $('.card-body').on('click',function(){
        $.ajax({
          type: "post",
          url: "{% url 'basket:remove'%}",
          data: {"product_code": "07316", "csrfmiddlewaretoken" : "{{csrf_token}}" }
        });
    })
});

양식이 표시되는 페이지/뷰를 캐싱하고 있지 않은지 확인하십시오.CSRF_TOKEN을 캐시하고 있을 가능성이 있습니다.나한테 일어난 일이야!

쿠키를 설정하려면 뷰에서 데코레이터를 사용합니다.

from django.views.decorators.csrf import ensure_csrf_cookie

@ensure_csrf_cookie
def hello(request):
    code_here()

다음 예시와 같이 X-CSRFTOKEN 헤더를 "{ csrf_token }}" 값으로 추가하는 방법도 있습니다.

$.ajax({
            url: "{% url 'register_lowresistancetyres' %}",
            type: "POST",
            headers: {//<==
                        "X-CSRFTOKEN": "{{ csrf_token }}"//<==
                },
            data: $(example_form).serialize(),
            success: function(data) {
                //Success code
            },
            error: function () {
                //Error code
            }
        });

디스패치 코드에 이 데코레이터를 포함시켜 보세요.

from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt     
@method_decorator(csrf_exempt, name='dispatch')
def dispatch(self, request, *args, **kwargs):
     return super(LessonUploadWorkView,self).dispatch(request,*args,**kwargs)

SSL/https 및 CSRF_COOKIE_HTTPONLY = False의 경우 django Doc에서 제안된 getCookie(name) 함수 또는 5f에서 제안된jquery.dlten을 사용하여 쿠키에 아직 csrftoken이 없습니다.

Wtower 요약은 완벽하고 settings.py에서 CSRF_COOKIE_HTTPONLY를 삭제한 후 동작할 줄 알았는데https에서는 동작하지 않습니다!

csrftoken이 document.cookie에 표시되지 않는 이유는 무엇입니까?

얻는 대신

"django_language=fr; csrftoken=rDr"GI5cp98MnoPIsysgWIF76vUYTKDIT"

나는 단지 얻을 수 밖에 없다

"django_language=fr"

왜? SSL/https가 X-CSRFToken을 헤더에서 삭제하는 것처럼 Nginx의 프록시 헤더 파라미터 때문인 줄 알았는데 아닌 것 같습니다.감 잡히는 게 없어요?

django doc Notes와는 달리 https를 사용하는 쿠키에서는 csrf_token을 사용할 수 없습니다.csrftoken을 전달하려면 html에서 {% csrf_token %}을(를) 사용하여 DOM을 통과하고 를 사용하여 jQuery로 가져오는 방법밖에 없습니다.

var csrftoken = $('input[name="csrfmiddlewaretoken"]').val();

그런 다음 헤더(xhr.setRequest) 중 하나를 사용하여 Ajax에 전달할 수 있습니다.헤더) 중 하나를 사용합니다.

이거면 돼

template.template.displate

  $.ajax({
    url: "{% url 'XXXXXX' %}",
    type: 'POST',
    data: {modifica: jsonText, "csrfmiddlewaretoken" : "{{csrf_token}}"},
    traditional: true,
    dataType: 'html',
    success: function(result){
       window.location.href = "{% url 'XXX' %}";
        }
});

view.py

def aggiornaAttivitaAssegnate(request):
    if request.is_ajax():
        richiesta = json.loads(request.POST.get('modifica'))

폴더 chmod 755와 파일(.php ,.html) chmod 644를 변경해야 합니다.

언급URL : https://stackoverflow.com/questions/19333098/403-forbidden-error-when-making-an-ajax-post-request-in-django-framework

반응형