2014-12-11

使用 jquery post data 進 django 系統

django 有 csrf 防止 cross site 攻擊,所以當你要使用 ajax post 到 django 時就會被擋。
解決方法有二:
第一是用 get, 例如:



$.getJSON('/account/email_verify/', {account_id: $("#account").val(), email:"{{email}}" }, function(data){
            console.log(data); // print returned data
        });

get 方法是最直覺簡單的


第二方法是用 jquery 從 cookie 取 csrf 值, 方法如下:
這個地方下載 jquery 的 cookie plugin

然後把 你下載的 jquery.cookie.js include 到你的 html 頁面中

<script src="{% static "js/jquery.cookie.js" %}"></script>


並將以下這段加到你的 html 頁面中
這段程式碼將會設定 ajax 在 before send 前跟 django 系統要求合法 csrf token
function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
        }
    }
});


終於到了 post 的步驟
jquery 有 getJSON, 但卻沒有 postJSON ,但是,沒關係我們可以用 $.post(URL, PARAM, CALLBACK, 'json') 來辦到 (同效)

$.post("/account/email_verify/", {account_id: $("#account").val(), email:"{{email}}" }, function(data, textStatus) {
       if (textStatus == "success")
           console.log("success...")
       else
           console.log("fail...")
       console.log(data);
 }, "json");


參考資料:https://docs.djangoproject.com/en/dev/ref/csrf/

沒有留言:

張貼留言