2017-03-24 2 views
1

내 서버의 프로덕션 모드에서만 발생하는 누락 된 CSRF_Token 오류가 발생합니다. 그러나 runserver 명령을 사용하여 내 컴퓨터 터미널에서 실행할 때 모든 것이 잘 작동합니다. 나는 이것에 관련된 많은 다른 질문을 행운으로 읽었습니다. 내 사건은 다른 것들과 약간 다르다. 왜냐하면 그것은 지역적으로 일하지만 생산에는 그렇지 않기 때문이다.Django CSRF 토큰이 프로덕션에만 누락되었습니다.

views.py의 "제출"에 제출하는 Ajax 양식을 제출할 때 오류가 발생합니다. 아무도이 원인을 알 수 있습니까? 또한 프로덕션 모드에서 쿠키를 볼 때 CSRF_Token은 처음부터 존재하지 않습니다. 국지적으로 그렇습니다. 어떤 도움을 주셔서 감사합니다.

다음은 아약스에 관한

from django.shortcuts import render 

from django.http import HttpResponse 


def index(request): 

    return render(request, 'index.html') 


def submit(request): 
    #Receive Request 
    inputone = request.POST['randominfo'] 
    inputtwo = request.POST['randominfo2'] 

    #Some more code here that setups response. 
    #Deleted since Im posting to StackOverflow 

    return response 

코드는이 문제를 해결

$(function() { 
    $.ajaxSetup({ 
     headers: { "X-CSRFToken": getCookie("csrftoken") } 
    }); 
}); 

function getCookie(c_name) 
{ 
    if (document.cookie.length > 0) 
    { 
     c_start = document.cookie.indexOf(c_name + "="); 
     if (c_start != -1) 
     { 
      c_start = c_start + c_name.length + 1; 
      c_end = document.cookie.indexOf(";", c_start); 
      if (c_end == -1) c_end = document.cookie.length; 
      return unescape(document.cookie.substring(c_start,c_end)); 
     } 
    } 
    return ""; 
} 
function submitAjax(event){ 

     $.ajax({ 
      type:'POST', 
      url:'/submit/', 
      data:{ 
       randominfo:document.getElementById('Random').innerHTML, 
       randominfo2:document.getElementById('Random2').innerHTML, 

      }, 
      dateType: 'json', 
      success:function() { 
        # Url here 

      } 

     }) 
    }; 

솔루션을 제출 내 views.py입니다. 이 때문에 아약스 양식을

+0

이유는 단지 {%의 csrf_token의 %}'두지'템플릿으로 대신 직접 쿠키에서 그것을 얻으려고? –

+0

그게 내가 시도하지 않은 한가지. 아픈 보고서. 감사 –

답변

1

오류 ocurs을 포함 된 html 파일을 반환 views.py 및보기 위 다음 "@ensure_csrf_cookie" "django.views.decorators.csrf 수입 ensure_csrf_cookie에서"추가

<form id="id" name="form"> 
    {% csrf_token %} 
    <!-- Form body here --> 
</form> 
다음 CSRF 토큰을 설정하지 않는, 우리는 몇 가지 세부 사항 모든

먼저 확인해야이 문제를 방지하기 위해, 당신은 당신의 HTML에 당신은 다음과 같은 몇 가지를 설정해야, 양식에 CSRF 토큰을 설정해야

두 번째로 th를 설정하는 방법 귀하의 요청 헤더에 전자 CSRF 쿠키 난 단지 대신에 하나, 사용 방법으로 데이터 필드를 설정하는 것이 좋습니다, 괜찮 JQuery와의 serialize

data: $("#your-form-id").serialize()

내가 추천하고 싶은 당신은 아약스에 대한이 post를 읽을 수 있습니다 많은 도움이 될 것입니다 장고와 요청

0

당신이 할 수있는 2 가지가 있습니다

1.) 당신의 아약스 호출에 CSRF 토큰을 제출가. 그것을 얻으려면 getCookie() 자바 스크립트 함수를 사용해야합니다. 다행히 django 문서 has some code을 복사하여 붙여 넣을 수 있습니다. 자바 스크립트

$.ajax({ 
     type:'POST', 
     url:'/submit/', 
     data:{ 
      randominfo:document.getElementById('Random').innerHTML, 
      randominfo2:document.getElementById('Random2').innerHTML, 
      'csrfmiddlewaretoken': getCookie('csrftoken'), // add this 
... 

2) 당신의/제출 뷰에 대한 CSRF를 사용하지 않도록 설정합니다. 데코레이터로이 작업을 수행 할 수 있습니다. 보안 수준이 낮아 기밀 데이터가 없는지 확인하십시오.

views.py :

from django.views.decorators.csrf import csrf_exempt 
... 
@csrf_exempt 
def your_submit_view(request): 
    #view code 
관련 문제