1. settings 속성
https://docs.djangoproject.com/en/4.0/ref/settings/
2. cookies에서 가져오기
global_settings.py에 지정된 이름으로 cookies에 발급된 csrf token이용
csrftoken 쿠키를 사용할려면 view가 {% csrf_token %}이 사용된 템플릿을 렌더링해야 한다.
그렇지 않을 경우 cookie로 csrf 토큰 쿠키를 Django가 설정하지 않을 수 있다. 즉 'csrftoken'이란 이름을 가진 cookie가 만들어져 있지 않다.
https://docs.djangoproject.com/en/4.0/ref/csrf/#ajax
template html없이 ajax호출이 필요할때 csrftoken을 강제로 만들어 주는 메소드를 호출해준다. 아래 링크 참조
https://docs.djangoproject.com/en/4.0/ref/csrf/#page-uses-ajax-without-any-html-form
그래서 첫 페이지 호출 view를 아래와 같이 수정하면 된다.
변경전
class HomeView(TemplateView):
template_name = "home.html"
def get_context_data(self, **kwargs):
context = TemplateView.get_context_data(self, **kwargs)
변경후
@method_decorator(ensure_csrf_cookie, name="get")
class HomeView(TemplateView):
template_name = "home.html"
def get(self, request, *args, **kwargs):
return TemplateView.get(self, request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = TemplateView.get_context_data(self, **kwargs)
global_settings.py
CSRF_COOKIE_NAME = 'csrftoken'
javascript
getCsrftoken : function()
{
return UT.getCookie("csrftoken");
},
getCookie : function(cname)
{
....
},
ajax : function(type, url, data, callbackSuccess, callbackError)
{
var _csrftoken = UT.getCsrftoken();
$.ajax({ type: type
, url: url
, data: data
, dataType: "json"
, headers: {"X-CSRFToken": _csrftoken}
, success: callbackSuccess
, error: callbackError
});
3. meta tag에 지정하여 사용하기
<!DOCTYPE html>
<html lang="ko">
<head>
<title>{% block title %}{{ site.name }}{% endblock title %}</title>
<meta name="csrf_token" content="{{ csrf_token }}">
<meta name="viewport" content="width=device-width, initial-scale=1">
template html에 {{csrf_token }}을 사용하면 앞서 언급했듯이 Django가 이미 csrftoken cookie가 만들어놔서
사실 아래처럼 Meta tag를 참조 할 필요없이 cookie에 기록된 'csrftoken'을 사용하면 되나,
또 다른 활용법으로 기록해 본다.
var _csrftoken = document.querySelector("meta[name=csrf_token]").content;
$.ajax({ type: type
, url: url
, data: data
, dataType: "json"
, headers: {"X-CSRFToken": _csrftoken}
, success: callbackSuccess
, error: callbackError
});