gpt4 book ai didi

javascript - 如何: Dynamically generate CSRF-Token in WTForms with Flask

转载 作者:行者123 更新时间:2023-11-28 06:44:11 28 4
gpt4 key购买 nike

我有一个水果表单,其中有一个用于香蕉的 FieldList 对象:

bananas = FieldList(FormField(BananaForm))

在前端,最初,我将其中一个字段添加到 FieldList

form.append_entry()

现在,我使用 Javascript 成功创建了函数,可以动态添加(加号按钮)或删除(减号按钮)可填充信息的 BananaForm 字段的数量。

FielstList 自动为其所有字段创建 id。因此,要使用 js 进行动态添加,我复制 HTML 代码并设置字段 id += 1,例如:

第一个字段:

<tr>
<td><input id="bananas-0-originCountry" type="text" /></td>
</tr>

+= 1 的重复字段:

<tr>
<td><input id="bananas-1-originCountry" type="text" /></td>
</tr>

当我这样命名它们并提交表单时,WTForms 将自动识别后端添加的字段(工作正常)。

到目前为止一切顺利,但这是我的问题:为了使表单有效,我必须向每个 WTForm 添加 CSRF 字段。在 Jinja 模板中,我使用以下方法执行此操作:

{{ form.hidden_tag() }}

但是,当我使用 js 函数复制 HTML 时,我缺少 CSRF 字段(因为在提交之前,后端表单对象不知道添加的 FormFields)。那么如何动态生成这些 CSRF 字段呢? (Ajax 请求?如果是,如何实现?)

这应该是一个带有表单和 flask 的标准用例。我希望我的描述是可以理解的,如果不能理解,请告诉我。任何帮助表示赞赏!

更新:这是我的代码

JS 函数

function addBanana(){
// clone and insert banana node
var node = document.getElementById("fruitTable");
var trs = node.getElementsByTagName("tr");
var tr = trs[trs.length-2];
var tr2 = tr.cloneNode(true);
tr.parentNode.insertBefore(tr2, tr);

// in order to increment label and input field ids
function plusone(str){
return str.replace(
new RegExp("-(\\d+)-", "gi"),
function($0, $1){
var i = parseInt($1) + 1;
return "-" + i + "-";
}
);
}

// change inputs
var inputs = tr.getElementsByTagName("input");

for (var i = 0; i < inputs.length; i++){
inputs[i].setAttribute("id", plusone(inputs[i].getAttribute("id")));
}

var minusbutton =
['<td>',
'<button class="btn" type="button" onClick="removeBanana()"><i class="icon-black icon-minus"></i></button>',
'</td>'
].join('\n');

// only append at the first add
// second add automatically copies minus button
if (trs.length < 6){
tr.innerHTML += minusbutton
}
}

function removeBanana(){
var node = document.getElementById("fruitTable");
var trs = node.getElementsByTagName("tr");
var tr = trs[trs.length-2];
var trParent = tr.parentNode;
trParent.removeChild(tr);
}

Jinja 模板:

<form method="POST" action="newsubmit">
{{ form.hidden_tag() }}
<table id="fruitTable" class="table">
{{ render_field(form.description) }}
<tr><td><h3>Bananas</h3></td></tr>
{% set counter = 0 %}
{% for banana in form.bananas %}
<tr>
{{ banana.hidden_tag() }}
{% set counter = counter + 1%}
{% for field in banana if field.widget.input_type != 'hidden' %}
{{ render_field_oneline(field) }}
{% endfor %}
{% if counter > 1 %}
<td>
<button class="btn" type="button" onClick="removeBanana()"><i class="icon-black icon-minus"></i></button>
</td>
{% endif %}
</tr>
{% endfor %}
<tr><td></td><td><button class="btn" type="button" onClick="addBanana()"><i class="icon-black icon-plus"></i></button></td></tr>
</table>
<input class="btn btn-primary" style="margin-left:300px;"type="submit" value="Submit" />
</form>

Jinja 模板宏:

{% macro render_field_oneline(field) %}
<td>{{ field.label }}</td>
<td>{{ field(**kwargs)|safe }}
{% if field.errors %}
<ul class=errors>
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</td>
{% endmacro %}

{% macro render_field(field) %}
<tr>
{{ render_field_oneline(field) }}
</tr>
{% endmacro %}

最佳答案

我发现了它是如何工作的:

可以简单地复制 CSRF 标签。 id 必须相应地更改和递增,但哈希值可能保持不变。

我认为不可能有许多字段具有相同的 CSRF-Tag 哈希值,但实际上确实如此!

关于javascript - 如何: Dynamically generate CSRF-Token in WTForms with Flask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33533432/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com