广东建设工程网站免费软件不收费网站

当前位置: 首页 > news >正文

广东建设工程网站,免费软件不收费网站,西安百度推广公司,职业技术培训机构在了解了 Flask Bootstrap 基本框架之后#xff0c;我们来了解一下 Flask 框架的 表单( form )#xff0c;以帮助我们创建交互式的 Web 应用#xff0c;最后会有个提交个人信息的例子。 Flask-WTF 是 Flask 框架的一个扩展#xff0c;用来做表单的交互#xff0c;是对 WT…在了解了 Flask Bootstrap 基本框架之后我们来了解一下 Flask 框架的 表单( form )以帮助我们创建交互式的 Web 应用最后会有个提交个人信息的例子。 Flask-WTF 是 Flask 框架的一个扩展用来做表单的交互是对 WTForms 的集成默认支持 CSRF 安全签名并且继承文件上传功能。 安装 使用 pip 安装 pip install Flask-WTF 验证 from flask_wtf import FlaskForm 小试牛刀 创建表单类 Flask-WTF 能将 WTForms 集成到 Flask 应用中创建一个 app.py 主代码文件例如​​​​​​​ from flask_wtf import FlaskFormfrom wtforms import StringFieldfrom wtforms.validators import DataRequiredclass MyForm(FlaskForm): name StringField(name, validators[DataRequired()]) MyForm 是自定义的类继承自 FlaskForm其中定义了一个字段 name标题是 name, 且设置为非空。 表单模板 接下来创建一个表单模板 submit.html例如:​​​​​​​ form methodPOST action/ {{ form.csrf_token }} {{ form.name.label }} {{ form.name(size20) }} input typesubmit valueGo/form 其中 form.csrf_token 是 Flask-WTF 提供的一个防止跨站请求伪造的隐藏字段。原理是将一个密钥根据请求特征加密在表单提交时一起送到服务器端作校验。 密钥串与多种定义方式为了方便这里将密钥串定义在应用上: app.secret_key abc 注意上示例仅作演示说明不能在生产系统中用这样简单的密钥 之后则是对字段 name 的模板定义经过渲染会替换成 Html 控件。 定义视图函数 视图函数首先需要将表单渲染出来另外要对表单的提交作验证当然视图函数与提交验证函数也可不是同一个​​​​​​​ app.route(/, methods(GET, POST))def submit(): form MyForm() if form.validate_on_submit(): return redirect(/success) return render_template(submit.html, formform) 提交表单一般都是 POST 方法所以要确保视图函数支持 POST 视图函数中实例化一个 MyForm值得注意的时FlaskForm 示例化时会使用 request 中的 form 来初始化所以在下面才可以直接来校验表单 validate_on_submit 方法是 is_submitted 和 validate 的联合校验后面会详述 如果验证通过将跳转到 /success如果没有通过用 form 来渲染 submit.html 模板 运行 在主代码  app.py 中加入启动方法:​​​​​​​ if name main: app.run(debugTrue) 然后运行如果一起正常访问 localhost:5000, 就能看输入框和提交按钮点击提交会跳转到 /success 或者提升必填。 表单 FlaskForm 是 WTForms Form 的子类可以用来定一个表单定义表单中的字段验证方式等作为一个 Flask 和 Html 之间的一个数据载体。 另外 FlaskForm 集成了 CSRF 校验方便编写程序的同时提高访问安全性。定义 Form 对象时不用明确声明 CSRF 字段只需要在表单模板中填写  form.csrf_token 就行提交表单时视图函数会自动对 CSRF 进行校验。 FlaskForm 实例化参数中有个 formdata 参数用来设定 Form 中字段的值在视图函数中可以不提供 formdata会将 request.form 或者 request.files 中获取作为 formdata 参数这就是视图函数中实例化 Form 时不带任何参数在后面还能方法 Form 对象内容的原因。 字段及验证 FlaskForm 从 0.9.0 版本开始不再从 WTForms 中导入任何东西所以大部分字段和校验方法都直接引用自 WTForms如 from wtforms import StringField, IntergreField, validators 常用的字段
字段说明StringField文本字段IntergreField文本字段要求输入的时数字PasswordField文本字段输入内容会转会为小黑点DateField文本字段输入指定日期格式的字符串会转会为日期类型RadioField单选字段SelectField选择字段SelectMultipleField多项选择字段SubmitField表单的提交按钮 常用验证
验证说明DataRequired必填字段Email电子邮箱地址验证EqualTo验证与其他指定字段值是否相等Length输入字符串长度限制NumberRange输入数值大小限制URL网站格式验证 例如定义一个 MyForm 表单类:​​​​​​​ class MyForm(FlaskForm): name StringField(label姓名, validators[InputRequired()]) city StringField(城市, validators[validators.Length(min4, max25, message输入的长度不符合要求)]) birthday DateField(label生日, format%Y-%m-%d, validators[DataRequired(日期格式不正确)]) gender RadioField(label性别, choices[(1, male), (2, female)]) interest SelectMultipleField(label兴趣, choices[(1, Football), (2, Movies), (3, Reading)]) 如果字段值验证失败会将错误信息存放在字段的 errors 属性中errors 是个列表元素是每一个验证出现的问题信息通过设定验证的 message 参数指定。 要完整的在模板中定义字段以及错误信息是件乏味的事情这里通过一个自定义的模板宏来完成​​​​​​​ {% macro render_field(field) %} dt{{ field.label }}: dd{{ field(**kwargs)|safe }} {% if field.errors %} ul classerrors {% for error in field.errors %} li{{ error }}/li {% endfor %} /ul {% endif %} /dd{% endmacro %} 文件上传 上传文件是表单应用必不可少的可以通过 FileField 字段来设置因为需要视图函数对上传的文件进行处理所以这里单独作说明 定义一个有上传文件字段的表单类:​​​​​​​ from flask_wtf.file import FileFieldclass PhotoForm(FlaskForm): photo FileField(上传照片) 视图函数定义为:​​​​​​​ app.route(/upload, methods[GET, POST])def upload(): form PhotoForm() filepath None if form.validate_on_submit(): filename secure_filename(form.photo.data.filename) file form.photo.data filepath os.path.join(app.config[UPLOAD_FOLDER], filename) file.save( filepath ) else: filename None return render_template(photo.html, formform, filename filename) 在通过验证之后用方法 secure_filename 对上传文件名作安全处理这是很有必要的以防止通过文件名注入, 这个方法从库 werkzeug 中导入这个库会在在安装 Flask 时一起被安装。 之后拿到上传文件的数据这是已经经过 Flask 转化的 File 对象可以直接调用 save 方法存储上传的文件。 app.config[UPLOAD_FOLDER] 定义了文件存储的位置如:  app.config[UPLOAD_FOLDER] ./upload 完整的photoupload.py文件 import osfrom flask import Flask, render_template from flask_bootstrap import Bootstrap from flask_wtf import FlaskForm from flask_wtf.file import FileField from werkzeug.utils import secure_filenameclass PhotoForm(FlaskForm):photo FileField(上传照片)app Flask(name) app.secret_key abc app.config[UPLOAD_FOLDER] ./upload bootstrap Bootstrap(app)app.route(/upload, methods[GET,POST]) def upload():form PhotoForm()filepath Noneif form.validate_on_submit():filename secure_filename(form.photo.data.filename)file form.photo.datafilepath os.path.join(app.config[UPLOAD_FOLDER],filename)file.save(filepath)else:filename Nonereturn render_template(upload.html, form form,filenamefilename)if name main:app.run() 最后新建一个模板文件 upload.html​​​​​​​ !DOCTYPE html html langen headmeta charsetUTF-8titleTitle/title /head bodyform action /upload method post enctypemultipart/form-data{{ form.csrf_token() }}{{ form.photo() }}input type submit value 提交/form /body /html 注意模板中 form 的编码类型必须设置为 multipart/form-data Bootstrap 虽然 FlaskForm 使用起来已经很方便了但是还是有很多需要重复编写的地方以及展示效果不够美观的问题借助 Bootstrap-flask 将解决这些问题。 之前对 Bootstrap-flask 介绍中说国Bootstrap-flask 主要是定义了很多模板宏减少重复的编码对于表单同样提供了很多宏 首先在模板中导入 bootstrap 的 Form 相关宏: {% from bootstrap/form.html import render_form, render_form_row, render_field %} render_form 接受一个 Form 对象将其渲染成 Html 表单是最省事的例如:
{{ render_form(form) }} render_field 接受一个 Field 将其渲染成一个表单的字段
{{ render_field(form.name) }} render_form_row 接受一个 Field 列表将列表中的字段渲染到一行
模板代码如下:​​​​​​​ !DOCTYPE html html langen headmeta charsetUTF-8titleTitle/title /head body {% extends bootstrap/base.html %} {% from bootstrap/form.html import render_form, render_form_row, render_field %} {{ bootstrap.load_css() }} h1 render_form /h1 {{ render_form(form) }}h1render_form_row/h1 form methodpost {{ render_form_row([form.name, form.city]) }}{{ render_form_row([form.gender, form.birthday]) }}{{ render_form_row([form.interest]) }} /formh1render_field/h1 form methodpost {{ render_field(form.name) }}{{ render_field(form.gender) }}{{ render_field(form.interest) }} /form /body /html 问题jinja2.exceptions.TemplateNotFound: bootstrap/form.html 先导入表单相关的宏然后加入 Bootstrap 的样式之后是各个宏的使用 总结 本节课程简单介绍了 Flask 中表单的处理方式和方法包括 FlaskFormWTForms和一些常用的字段最后说明了 Bootstrap-flask 对表单的支持以便是 Web 开发更高效。