2011-10-12 57 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没有发送到表单类的未知字段名称的问题,它会高兴地忽略它们,因此隐藏字段折除的取消非常小。