gpt4 book ai didi

python - 在 WTForms 和 Flask 中考虑禁用字段进行验证

转载 作者:太空狗 更新时间:2023-10-29 17:26:39 47 4
gpt4 key购买 nike

我在页面中禁用了一些字段,例如:(使用 jinja2 模板系统)

<html>
<body>
<form action="" method=POST>
{{ form.name(disabled=True) }}
{{ form.title }}
-- submit button --
</form>
</body>
</html>

字段在表单中按预期被禁用。

在我的 views.py 中:在对表单提交执行 validate_on_submit() 时,它失败并在禁用的“名称”字段上显示验证错误。我希望验证忽略禁用字段。这是正确的行为吗?如果是这样,您能否告知如何处理这种情况?

更新:

class TeamForm(wtf.Form):
name = wtf.TextField("Team Name", validators=[validators.Required()])
title = wtf.TextField("Title", validators=[validators.Required()])

最佳答案

这实际上是一个有趣的问题,WTForms 解决它的方式是有意要求明确的,因为它与安全有关并且不允许用户伪造输入。

因此目的是,“经理”不能编辑名称,而“管理员”可以。

乍一看这似乎很明显,只需禁用 HTML 中的字段,然后像这样编写 View :

def edit_team():
form = TeamForm(request.POST, obj=team)
if request.POST and form.validate():
form.populate_obj(team) # <-- This is the dangerous part here
return redirect('/teams')
return render('edit_team.html')

正如所写,这是一个主要的安全风险,因为HTML 表单中的禁用属性仅在客户端可用。任何拥有 HTML 检查器(即 FireBug、webkit 文档检查器等)的人都可以删除此属性,或者有人可以像这样简单地发出请求:

POST /edit_team/7 HTTP/1.0
Content-Type: application/x-urlencoded

team=EVILTEAMNAME&title=foo

当然,问题是,我们如何在服务器端正确地控制这个,对应于这样做的适当方式?使用 WTForms 的正确方法是首先不要有该字段。有几种方法可以做到这一点,一种是使用表单组合,例如ManagerTeamForm 和 AdminTeamForm(有时这更好)但有时更容易 use del to remove specific fields .

下面是您编写 View 的方式,并且没有验证问题:

def edit_team():
form = TeamForm(request.POST, obj=team)
if user.role == 'manager':
del form.name
if request.POST and form.validate():
form.populate_obj(team)
return redirect('/teams')
return render('edit_team.html')

并快速修改模板:

<html>
<body>
<form action="" method=POST>
{% if 'name' in form %}
{{ form.name() }}
{% else %}
{{ team.name|e }}
{% endif %}
{{ form.title }}
-- submit button --
</form>
</body>
</html>

wtforms 最佳实践的一些引用:

关于python - 在 WTForms 和 Flask 中考虑禁用字段进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16481924/

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