Six*_*its 9 python html5 flask wtforms flask-wtforms
我正在使用Flask开发Web应用程序.我原来是手动编写HTML表单,然后切换到使用WTForms(这是一个教育项目,所以我展示了构建项目的每一步).
尝试添加HTML5表单字段时,我有点困惑,比如EmailField.我搜索了WTForms文档,并在线搜索,我无法找到如何使用HTML5 EmailField创建WTForm.
然后我安装了这个模块https://pypi.python.org/pypi/wtforms-html5,允许它,一切正常.但是我对添加额外的依赖感到不满意,特别是因为它似乎没有积极开发(https://github.com/brutus/wtforms-html5).
然后我结束了WTForms github页面,发现实际上支持所有新的HTML5字段,但默认情况下不会导入这些字段.https://github.com/wtforms/wtforms/blob/master/wtforms/fields/html5.py因此,而不是使用
from WTForms import EmailField
Run Code Online (Sandbox Code Playgroud)
正如人们所推断的那样
from WTForms import TextField
Run Code Online (Sandbox Code Playgroud)
一个人必须使用
from wtforms.fields.html5 import EmailField
Run Code Online (Sandbox Code Playgroud)
我以前使用wtforms-html5模块如下
from wtforms_html5 import EmailField
Run Code Online (Sandbox Code Playgroud)
因此,我更改了所有出现的内容wtforms_html5,wtforms.fields.html5并且我的应用程序完全按预期工作.
好的,感谢您阅读所有背景资料.现在提问:
为什么WTForms文档中没有提到任何html5字段(EmailField,DateField等)?
为什么这些字段默认情况下不会像其他字段一样导入WTForms
这些字段是否稳定/打算使用?
从WTForms导入字段的最佳做法是什么?
对于Text字段,我可以使用以下任何一种方法:
from wtforms import TextField
from wtforms.fields import TextField
from wtforms.fields.simple import TextField
Run Code Online (Sandbox Code Playgroud)
但对于EmailField,我必须使用
from wtforms.fields.html5 import EmailField
Run Code Online (Sandbox Code Playgroud)
我想要:
from wtforms.fields import TextField
from wtforms.fields import EmailField
Run Code Online (Sandbox Code Playgroud)
但是这需要在fields [__init__][1]文件中添加一行,我不愿意这样做,因为它是一个教育项目,这只会让学习者感到困惑.
我在寻找
前言,我是作者之一,目前是WTForms的主要维护者
在我了解为什么我应该为使用WTForms的人们提到一个非常常见的模式之前,就是创建自己的模块,将所需的所有位组合成一个命名空间.
例如,myapp/forms.py你做了类似的事情:
from wtforms.fields import *
from wtforms import widgets, Form as _Form
from wtforms.fields.html5 import EmailField,
class Form(_Form):
"""Awesome base form for myapp. Includes CSRF by default"""
class Meta:
csrf = True
csrf_secret = 'secretpasswordhere'
@property
def csrf_context(self):
return get_current_request().session
# maybe add some methods you really wanted to have on your Form class
Run Code Online (Sandbox Code Playgroud)
您可以使用以上内容:
from myapp.forms import Form, TextField, EmailField, ...
class UserForm(Form):
name = TextField(...)
email = EmailField(...)
Run Code Online (Sandbox Code Playgroud)
或者像星球一样进口 from myapp.forms import *
您将注意到我还包括一个自定义表单子类,它设置CSRF并默认提供CSRF上下文,这不是绝对必要的.(顺便说一句,如果您使用的是烧瓶,Flask-WTF会为您设置类似的CSRF设置,但重点是说明如何轻松实现自己的集成.)
现在为什么.
WTForms的核心思想是提出一个非常简单,可靠的框架,适用于大多数用例,但是可扩展性足以让人们可以提供配套工具来处理特定的用例.
在早期,这样做的解决方案是将interop的扩展与各种库结合在一起.但这带来了一个问题,因为它极大地增加了测试的复杂性和表面区域,而且它会以奇怪的方式驱动WTForms版本(Django只是改变了这一点,现在你需要发布一个新的WTForms).所以在2015年,我们决定将所有扩展移动到他们自己的包中,以允许他们自己的发布时间表.
与其强迫人们使用一个试图完成所有事情的单一软件包,这已经形成了一个真正伟大的生态系统,其中包括Flask-WTF,WTForms-Alchemy和WTForms-Django等坚实的配套软件包.
至于HTML5类型没有记录的原因; 好吧,这是一个遗漏.还有一些历史:在某些时候,我们将默认的WTForms字段输出从XHTML样式切换为HTML紧凑语法; 但保留了核心领域的产出.因此,我们让人们回馈XHTML表单,人们贡献html5字段,以及希望默认字段使用HTML5类型的人,所有这些都在我们保证在主要版本中的向后兼容性之后,这迫使我们的手.
我知道这是一个很长的答案,也许简短的说法是:虽然WTForms通常可以与大多数Web框架一起使用,但它的设计是根据您的用途进行配置和定制的.一切都不插即用.