403 Django 프레임워크에서 ajax Post 요청을 할 때 금지된 오류 발생
저는 Jquery를 Django 프레임워크로 만들고 있는 웹 어플리케이션에 통합하려고 합니다. 것을 하다.ajax
및 은 다음과 같습니다.html、 javascript 、 javascript 。
<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
'bestsource' 카테고리의 다른 글
@Component에서 클래스에 주석을 다는 경우 Spring Bean과 Singleton을 의미합니까? (0) | 2023.03.20 |
---|---|
실제 데이터를 사용하여 테스트할 수 있는 공개적으로 액세스 가능한 JSON 데이터 소스가 있습니까? (0) | 2023.03.20 |
케이스 .. Oracle SQL 표현시 (0) | 2023.03.20 |
Eclipse 자체에서 Spring Boot 웹 애플리케이션을 실행하는 방법은 무엇입니까? (0) | 2023.03.20 |
2개의 json 객체의 차이 가져오기 (0) | 2023.03.20 |