알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

ajax+django(csrf) 통신하기 본문

Web /JQuery

ajax+django(csrf) 통신하기

백곳 2017. 8. 27. 16:47

ajax+django(csrf) 통신하기


ajax는 http의 post or get 을 이용한 통신을 합니다. 


우선 test할 html 파일은 django 서버에 탬플릿 폴더에 있어야 합니다. 


브라우저 들이 정책상 ajax의 데이터를 서버와 같은 곳에서 호출해야 하기 때문


예를 들면 post 로 데이터를 보낼 서버의 IP 주소가 와 포트가 10.23.10.232:8888 


이라고 합니다. 


그때 ajax에서 


url:'/polls/searchData/'  


이러한 속성을 설정하는데 


여기에서 url 은  http://10.23.10.232:8888/polls/searchData 을 의미하지만 


다른 웹서버(예를들면 10.23.10.230:8888)에 똑같은 내용의 웹서버가 있어 http://10.23.10.230:8888/polls/searchData  으로 통신을 시도하면 


url:'http://10.23.10.230:8888/polls/searchData' 설정하면 


에러가 나는것입니다. 


여기서는 Django 를 학습 했으니 django 기준으로 설명을 하겠습니다. 


우선 Django 강의 에서 사용했던  것을 이어서 사용하겠습니다. 


프로젝트 이름은 : mysite

app에 이름은 polls 으로 작성을 했었습니다. 안보신 분은 참고 해주시면 되겠습니다. 


polls/views.py

def ajaxproject(request):
    template = loader.get_template('polls/test6.html')
//context 는 의미 없음 그냥 쓰레기 데이터 입니다. 그냥 사전 형식 으로 변수를만들기 위해서 코딩한것입니다. 
    context = {'latest_question_list': "5tte"}  
    return HttpResponse(template.render(context,request))


polls/urls.py

urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^ajaxproject/$', views.ajaxproject, name='ajaxproject'),
]


ajax 을 사용할 페이지를 링크합니다. 


polls/templates/test6.html

<!DOCTYPE html>

<html>
    <head>
        <script src="http://code.jquery.com/jquery-latest.js"></script>

    </head>
    <body>
        <div id="result"></div>

            <input type="text" id="msg" />    
            <input type="submit" value="get result" id="getResult" />
        <script>
            $('#getResult').click( function() {
                $.ajax({
                    url:'/polls/searchData/',
                    dataType:'json',
                    type:'POST',
                    data:{'msg':$('#msg').val()},
                    success:function(result){
                        $('#result').text(result['msg']);
                    }
                });
            })
        </script>
    </body>
</html>


소스를 분석 하자면 id="getResult" 는 태그를 클릭 했을때  ajax로 

 url:'/polls/searchData/'

 post 할 주소를 설정하고 

 type:'POST'

  데이터 전송 형식은 post

 success:function(result) 

 통신에서 데이터를 받았을때 실행 하는 이벤트로써  $('#result') 를 찾아 text 내용을 변경하는것입니다. 

 dataType:'json'

 json 형식으로 데이터를 받아서 처리하겠하는 것입니다.  

 data:{'msg':$('#msg').val()} 데이터를 POST 로 보낼때 value name 을 'msg' 로 설정해서 <input type="text" id="msg" /> 내용을 보내는 것입니다.



이제 데이터를 post 로 보낼 /polls/searchData/ app을 만들어야 합니다.


polls/views.py

from django.views.decorators.csrf import csrf_exempt
import json
def ajaxproject(request):
    template = loader.get_template('polls/test6.html')
    context = {'latest_question_list': "5tte"}  
    return HttpResponse(template.render(context,request))
@csrf_exempt
def searchData(request):
    data = request.POST['msg']
    context = {'msg': data,}
    return HttpResponse(json.dumps(context), "application/json")

여기서에서 @csrf_exempt 는 csrf 보안을 사용 하기 않겠다는 의미 입니다.  참조사이트 [ django csrf 문서 ]


그리고 크롬에서 들어가면 


하지만 일반적으로 django 는 csrf 을 사용합니다. 


csrf 사용하기 


polls/views.py

from django.views.decorators.csrf import csrf_exempt
import json
def ajaxproject(request):
    template = loader.get_template('polls/test6.html')
    context = {'latest_question_list': "5tte"}  
    return HttpResponse(template.render(context,request))
def searchData(request):
    data = request.POST['msg']
    context = {'msg': data,}
    return HttpResponse(json.dumps(context), "application/json")

@csrf_exempt 을 지웁니다. 


polls/templates/test6.html

<!DOCTYPE html>

<html>
    <head>
        <script src="http://code.jquery.com/jquery-latest.js"></script>
        <script>
             // using 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;
              }
              function csrfSafeMethod(method) {
                // these HTTP methods do not require CSRF protection
                return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
              }
              $(document).ready(function() {
                var csrftoken = getCookie('csrftoken');
                $.ajaxSetup({
                  beforeSend: function(xhr, settings) {
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                      xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                  }
                });
              });
        </script>
    </head>
    <body>
        <div id="result"></div>
            {% csrf_token %}
            <input type="text" id="msg" />    
            <input type="submit" value="get result" id="getResult" />
        <script>
            $('#getResult').click( function() {
                $.ajax({
                    url:'/polls/searchData/',
                    dataType:'json',
                    type:'POST',
                    data:{'msg':$('#msg').val()},
                    success:function(result){
                        $('#result').text(result['msg']);
                        console.log(result['msg'])
                    }
                });
            })
        </script>
    </body>
</html>


위와 같이 작성 하여야 하는데 

        <script src="http://code.jquery.com/jquery-latest.js"></script>
        <script>
             // using 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;
              }
              function csrfSafeMethod(method) {
                // these HTTP methods do not require CSRF protection
                return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
              }
              $(document).ready(function() {
                var csrftoken = getCookie('csrftoken');
                $.ajaxSetup({
                  beforeSend: function(xhr, settings) {
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                      xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                  }
                });
              });
        </script>


이부분은 참조사이트 [ django csrf 문서 ] 에 이렇게 사용하라고 적혀 있으니 굳이 어렵게 분석 하지 마시고 사용하면 되겠습니다. 

{% csrf_token %} 은  django 에서 csrf 을 사용하기 위해서 사용 되는 부분입니다. 

이부분은 브라우저에서 봤을때 

<input type='hidden' name='csrfmiddlewaretoken' value='F6cEfQTr4OUYlfxRSt4feZlMvybm0P111mSDpNzvooigzRK5xERNTddhkKDc9nwR' />


으로 알수 없는 값으로 표현 되지만 csrf 을 쓰기위한 데이터로 사용 됩니다. 




통신하면 똑같은 값을 얻을수 있습니다. 




'Web > JQuery' 카테고리의 다른 글

[jQuery]애니메이션  (0) 2017.08.25
[jQuery ] 폼 이벤트  (0) 2017.08.23
[jQuery]엘리먼트 제어  (0) 2017.08.23
[javascript,jQuery] 이벤트란?  (0) 2017.08.23
[jQuery] Chain이란?  (0) 2017.08.23
Comments