我有一个简单的表单要提交给龙卷风POST,并且我在龙卷风中运行xsrf。以下产生已知的错误:POST中缺少'_ xsrf'参数
有人解决了如何使用JavaScript以常规HTML格式提交xsrf(例如 {%module xsrf_form_html()%} )吗?这是代码:
<form action="#" id="form_field">
{% raw xsrf_form_html() %} # DOES NOT WORK!
<p><input type="text" id="field1" value=""></p>
</form>
<button id="button">UPDATE</button>
<script>
button.onclick = function changeField() {
var xhr = new XMLHttpRequest();
xhr.open("POST", "/chatdata", true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify({
value: document.getElementById("field1").value
}))
};
</script>
答案 0 :(得分:0)
According to the documentation page,您将只创建一个具有_xsrf
请求字段的请求,例如x-www-urlencoded
的{{1}}字符串。拥有的方式是,您只发送一些具有_xsrf=yourtoken
属性的JSON,即value
。
现在,您可以通过设置cookie或通过{"value":"token"}
调用生成的字段,以几种方式从我所看到的中获取令牌。
来自cookie
xsrf_form_html()
请注意,您必须直接或通过类似jQuery's serialize()
的库方法来构建包含其他输入表单字段的字符串。如果只想直接使用表单中的数据,而不必麻烦地抓住每个输入并自己生成一个适当的x-www-urlencoded字符串;然后继续使用//helper function to read cookie, from http://www.tornadoweb.org/en/stable/guide/security.html sample
function getCookie(name) {
var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
return r ? r[1] : undefined;
}
var data = "_xsrf="+getCookie('_xsrf');
//note using this method you don't set the content-type,
//you want it to default to x-www-urlencoded
xhr.send(data);
并从该表单创建一个FormData对象并将其发送。当您将表单元素传递给xsrf_form_html()
时,它将为您收集所有输入值。
FormData()
如果您不知道如何直接获取对生成的字段的引用,则使用FormData会有所帮助。尽管很有可能会有var data = new FormData( document.getElementById('form_field') );
//again no need to set the content-type as it will be automatically set internally
xhr.send(data);
//You could also use library methods like jQuery's serialize()
var data = jQuery('#form_field').serialize();
xhr.send(data);
,所以应该选择name="_xsrf"
之类的选择器。虽然您必须查看生成的html才能找到答案。
input[name="_xsrf"]
答案 1 :(得分:0)
xsrf_form_html
适用于使用x-www-form-urlencoded
的传统html表单。如果您将表单提交为JSON,则不会被识别。要在Tornado的XSRF保护中使用基于非格式的编码,请将XSRF令牌作为X-XSRF-Token
HTTP标头传递。