Skip to content

Instantly share code, notes, and snippets.

@salexkidd
Forked from anonymous/django_ajax.coffee
Last active December 14, 2015 18:59
Show Gist options
  • Save salexkidd/5132942 to your computer and use it in GitHub Desktop.
Save salexkidd/5132942 to your computer and use it in GitHub Desktop.
Djangoで面倒なことなくjQueryの$.ajaxを使いたい件 Djangoでajaxを使うときにCSRF Tokenがないと怒られたので、$.ajaxを上書きして勝手にHTTP Headerに"X-CSRFToken"をつけて送ってやろうと思った。予想以上にうまく動いたので公開している。しかし、反省はしてない などど申しており… ていうかanonymous gistでつくっちまったので再度作成しなおし。

【Django】Ajax時のCSRF Token問題から開放されたい

以下の苦しみから開放されたい(俺が)

  • DjangoにjQuery などで ajax リクエスト投げると CSRF Token がないと泣く
  • web を探索して これにぶち上たって泣く
  • $.ajaxのbeforeSend に "X-CSRFToken"を仕込む作業をしながら泣く
  • 全部の post 系 ajax のところに仕込んでいく姿を想像して泣く

もう、泣かない!

以下のようにすれば楽になるんじゃね?

  • jQuery の $.ajax を書き換えて勝手に X-CSRFToken ヘッダーつける
  • CSRF Tokenがない場合は X-CSRFToken をヘッダーに付けない

使い方

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>

とか書いてあると思うから(きっとbase.htmlとかに書いてあるよね!)、その下に

<script type="text/javascript" src="[django_ajax.jsの読み込み先]"></script>

を追加すればおk!

安定動作にむけて

ぶっちゃけつくりたてでgistに貼りたかっただけなのでどうなるかわからないれす(^q^)

変更

  • v1.0 なんとなくできたので貼り付け
  • v1.1 バグ修正
  • v1.2 GETでもヘッダにX-CSRFTokenをつけるようにした

連絡先 と謝辞

Django!Django!Django!Djangoぅぅうううわぁああああああああああああああああああああああん!!!
あぁああああ…ああ…あっあっー!あぁああああああ!!!DjangoDjangoDjangoぅううぁわぁああああ!!!
あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!いい匂いだなぁ…くんくん
んはぁっ!DjangoたんのPythonの髪をクンカクンカしたいお!クンカクンカ!あぁあ!!
間違えた!モフモフしたいお!モフモフ!モフモフ!髪髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!!
PythonPythonのDjangoたんかわいかったよぅ!!あぁぁああ…あああ…あっあぁああああ!!ふぁぁあああんんっ!!
PythonPython決まって良かったねDjangoたん!あぁあああああ!かわいい!Djangoたん!かわいい!あっああぁああ!
PythonPythonも発売されて嬉し…いやぁああああああ!!!にゃああああああああん!!ぎゃああああああああ!!
ぐあああああああああああ!!!Pythonなんて現実じゃない!!!!あ…PythonもPythonもよく考えたら…
D j a n g o ち ゃ ん は 現実 じ ゃ な い?にゃあああああああああああああん!!うぁああああああああああ!!
そんなぁああああああ!!いやぁぁぁあああああああああ!!はぁああああああん!!ハルケギニアぁああああ!!
この!ちきしょー!やめてやる!!現実なんかやめ…て…え!?見…てる?表紙絵のDjangoちゃんが僕を見てる?
表紙絵のDjangoちゃんが僕を見てるぞ!Djangoちゃんが僕を見てるぞ!挿絵のDjangoちゃんが僕を見てるぞ!!
PythonのDjangoちゃんが僕に話しかけてるぞ!!!よかった…世の中まだまだ捨てたモンじゃないんだねっ!
いやっほぉおおおおおおお!!!僕にはDjangoちゃんがいる!!やったよPython!!ひとりでできるもん!!!
あ、PythonのDjangoちゃああああああああああああああん!!いやぁあああああああああああああああ!!!!
あっあんああっああんあPythonぁあ!!セ、セイバー!!シャナぁああああああ!!!ヴィルヘルミナぁあああ!!
ううっうぅうう!!俺の想いよDjangoへ届け!!ハルケギニアのDjangoへ届け!

Twitter:@salexkidd

###
get cookie function by
URL -> https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax
###
getCookie = (name) ->
cookieValue = null
if document.cookie and document.cookie isnt ""
cookies = document.cookie.split(";")
i = 0
while i < cookies.length
cookie = jQuery.trim(cookies[i])
# Does this cookie string begin with the name we want?
if cookie.substring(0, name.length + 1) is (name + "=")
cookieValue = decodeURIComponent(cookie.substring(name.length + 1))
break
i++
cookieValue
$.ajax_original = $.ajax
###
My Original Function
###
$.ajax = (ajax_data) ->
orig_before_send = ajax_data.beforeSend ? null
try
csrf_token_val = getCookie("csrftoken")
catch error
return $.ajax_original(ajax_data)
before_send = (req) ->
if orig_before_send
orig_before_send(req)
req.setRequestHeader "X-CSRFToken", csrf_token_val
return
ajax_data.beforeSend = before_send
return $.ajax_original ajax_data
/*
get cookie function by
URL -> https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax
*/
var getCookie;
getCookie = function(name) {
var cookie, cookieValue, cookies, i;
cookieValue = null;
if (document.cookie && document.cookie !== "") {
cookies = document.cookie.split(";");
i = 0;
while (i < cookies.length) {
cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) === (name + "=")) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
i++;
}
}
return cookieValue;
};
$.ajax_original = $.ajax;
/*
My Original Function
*/
$.ajax = function(ajax_data) {
var before_send, csrf_token_val, orig_before_send, _ref;
orig_before_send = (_ref = ajax_data.beforeSend) != null ? _ref : null;
try {
csrf_token_val = getCookie("csrftoken");
} catch (error) {
return $.ajax_original(ajax_data);
}
before_send = function(req) {
if (orig_before_send) {
orig_before_send(req);
}
req.setRequestHeader("X-CSRFToken", csrf_token_val);
};
ajax_data.beforeSend = before_send;
return $.ajax_original(ajax_data);
};