알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)
ajax+django(csrf) 통신하기 본문
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 |