我得到了一些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
#...
}
- Adding `{% csrf_token %}` immediately after my form declaration。我也尝试向我的`index`视图添加代码以将`csrf_token`发送到`index`;这使得令牌在呈现的index.html源代码中可见(我收集的内容是一个糟糕的主意)。
我见过几个关于这个问题的问题(和Django书中的参考资料),但没有看到一个简单明确的答案。例如,即使我要容忍发布我的csrf_token
(我仍然知道这是一个糟糕的主意),但是我是否应该在我的索引页中呈现该内容仍然不清楚(然后它将提交表单将获得令牌)或者我是否应该在我的submit_form
代码中执行某些操作。上面链接的Django代码簿使用my_view
作为渲染令牌的视图函数;这个名字不是很有帮助!
有没有人有CSRF工作的小示例(用JavaScript修改窗体)?我真的认为这对于我和其他人在StackOverflow中看到这一点很有用。理想情况下,它会尽可能地简单(两种视图:一种是交付表格,另一种是印刷内容)
非常感谢您的帮助
更新:。我仍然得到这个错误,甚至当我prefent the csrfmiddlewaretoken
被移除。当我*不要做任何JavaScript的处理,我的方式是罚款和我。我已经验证过,只有我的
有没有某种方式,CSRF可以看到一些表单元素去掉?我在QueryDict
对象(使用POST从表单发送数据)中找不到任何不同的东西。
我真的很感谢任何帮助!