- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在页面中禁用了一些字段,例如:(使用 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/
我正在阅读 http://pythonhosted.org/WTForms/但它没有在任何地方定义过滤器函数的接口(interface),就像在 Field() 构造函数的 filters= 关键字参
在我的表单中,我尝试创建一个带有选择的自定义数组字段。 自定义表单字段: class CustomField(Field): widget = TextInput() def _val
我希望使用 Flask-WTForms 制作一个输入表单,其字段根据其他字段中的内容而变化。 例如,假设有一个“输入联系人”复选框。单击该按钮后,将出现(或激活)新字段,用于输入联系人的姓名和电话号码
这是我在 StackOverflow 上的第一篇文章,大家好。 我正在开发博客应用程序来学习 Python 和 Flask,我想在 Google App Engine 上启动它。不幸的是,我在将 WT
我正在尝试将数据从我的FlaskSQLAlChemy数据库自动填充到FlaskForm。以下是我的代码片段:。我想把这种型号的产品自动填充到一种可以接受购买的形式。以下是我的表格:。这是我的路线:。最
我使用的是最新版本的 flask、wtforms 和 Flask-WTForms。 我有一个显示表单的页面,其中一个是带有选项“A”的选择框。 应用程序启动时一切正常。在另一种形式中,我添加了一条名为
我有一个非常基本的 Flask 应用程序: from flask import Flask, render_template from flask_wtf import FlaskForm from
WTForms已更新为 2.3.0有了突破性的变化。我尝试调整其他要求,例如 werkzeug.1.0.0但还没有运气。有没有人找到解决办法? 这是堆栈跟踪: Traceback (most rece
在 WTForms 中,我可以根据数据库中的数据创建自定义验证器吗? 例如,我想显示一个多选字段,用户只能根据他们的帐户类型(存储在数据库中)选择一定数量的值。 预期的行为是这样的: 如果提交了表单,
我目前正在尝试使用 Flask 构建一个简单的 Web 应用程序。有了这个,我也在使用 WTForms,但是我在从表单中获取日期信息并对其进行验证时遇到了问题。 这是表格: from flask_wt
我有一个带有用户登录系统的 flask 应用程序。我现在注意到一些与用于注册和登录网站的电子邮件地址区分大小写相关的问题。 TL;DR 问题:我如何使用 Flask 表单的小写字母并使用它来评估用户是
我要求的其实很简单。我想创建一个包含一些字段和一个提交和一个取消按钮的表单。我想使用 Flask-Bootstrap 的 quick_form 模板函数来降低模板中的开销。我的表格是这样的: from
可能有更好的方法来执行此操作,但我正在尝试使用隐藏表单在 Flask 中使用 WTForms 定义按钮。当我尝试设置值时,这些字段似乎生成了两次。一次使用默认值“”,一次使用模板中设置的值。最终,在发
是否可以在离开字段后但在提交之前验证 WTForm 字段? 例如,在输入用户名后,在用户单击提交之前,验证该字段以查看其是否可用并显示复选标记。 最佳答案 当字段更改时,执行检查并更改相邻节点中的文本
我发现 IntegerField 在为空时不验证。要重现,请复制以下 block : from flask import Flask, render_template_string from flas
我需要将一个对象从我的数据库传递到我的表单,我想从中读取默认值。我当前的代码如下所示: 我的初始化: form = EditEventForm(event) 还有我的表单类: class EditEv
我正在使用 Flask 和 Flask-WTF,我需要创建一个包含多个具有相似结构的 block (子表单)的表单(例如具有一个 SelectField 和一个 TextAreaField 的子表单)
我需要将一个对象从我的数据库传递到我的表单,我想从中读取默认值。我当前的代码如下所示: 我的初始化: form = EditEventForm(event) 还有我的表单类: class EditEv
已经看过this答案,我无法让我的自定义 WTForm 验证器接受另一个参数。 我的代码的结构是我有一个 form_create() 方法,通过以下方式调用: form = other_fil
我在 Web 应用程序中使用 Python 3.7.4 以及 Flask 1.1.1 和 WTforms 2.2.1。 我正在尝试创建DateField像这样: user_birth = DateFi
我是一名优秀的程序员,十分优秀!