2011-10-12 55 views
0

我得到了一些good advice on StackOverflow關於如何使用JavaScript刪除所有隱藏的字段。刪除隱藏字段後Django中的CSRF錯誤

提交表單會將用戶發送到/submit,調用submit_form視圖。在我的views.py文件,我定義我的索引頁(與表),並接收提交的頁面(對我來說我/index頁打印錯誤,但這不應該影響任何東西):

def index(request, error_message = ''): 
    t = get_template('index.html') 
    html = t.render(Context({ 'ERROR_MESSAGE': error_message })) 
    return HttpResponse(html) 

def submit_form(request): 
    # get the POST data out of request and do something 
    pass 

我已經能夠通過將代碼更改爲:

from django.contrib.csrf.middleware import csrf_exempt 

@csrf_exempt 
def submit_form(request): 
    # get the POST data out of request and do something 
    pass 

這基本上關閉了submitForm函數的CSRF。但是,我相信這不是理想的解決方案(現在我不檢查我的表單中的僞造)。

我想更復雜的修復,像

  • 添加this code到緊跟在jQuery代碼(從提交刪除隱藏字段)
init:function(){ 
var ac=this 

    # advice from StackOverflow to remove hidden 
    # fields from POST submission 

    jQuery(document).ready(function($){ 
     $("form").submit(function() { 
     $(this).find(":hidden").remove(); 
    }); 

# AJAX CSRF code inserted here 
    #... 
} 

我見過幾個關於這個問題的問題(和Django書中的參考資料),但沒有看到一個簡單明確的答案。例如,即使我要容忍發佈我的csrf_token(我仍然知道這是一個糟糕的主意),但是我是否應該在我的索引頁中呈現該內容仍然不清楚(然後它將提交表單將獲得令牌)或者我是否應該在我的submit_form代碼中執行某些操作。上面鏈接的Django代碼簿使用my_view作爲渲染令牌的視圖函數;這個名字不是很有幫助!

有沒有人有CSRF工作的小示例(用JavaScript修改窗體)?我真的認爲這對於我和其他人在StackOverflow中看到這一點很有用。理想情況下,它會盡可能地簡單(兩種視圖:一種是交付表格,另一種是印刷內容)

非常感謝您的幫助


更新:。我仍然得到這個錯誤,甚至當我prefent the csrfmiddlewaretoken被移除。當我*不要做任何JavaScript的處理,我的方式是罰款和我。我已經驗證過,只有我的

有沒有某種方式,CSRF可以看到一些表單元素去掉?我在QueryDict對象(使用POST從表單發送數據)中找不到任何不同的東西。

我真的很感謝任何幫助!

回答

5

問題是你刪除了隱藏的CSRF字段,解決方法是不刪除這個字段,你可能會這樣做,使用jQuery選擇器讓它忽略該字段:not(input [name = csrfmiddlewaretoken] )。

順便說一句,Django沒有發送到表單類的未知字段名稱的問題,它會高興地忽略它們,因此隱藏字段折除的取消非常小。