Flask笔记(3)--扩展包Flask-WTF,Flask-Moment
来源:互联网 发布:飞科剃须刀怎么样 知乎 编辑:程序博客网 时间:2024/05/16 04:37
flask-wtf
安装:pip install flask-wtf
flask_wtf是一个关于表单的扩展库,默认情况下, Flask-WTF 能保护所有表单免受跨站请求伪造( Cross-Site Request Forgery,CSRF)的攻击。恶意网站把请求发送到被攻击者已登录的其他网站时就会引发 CSRF 攻击。为了实现 CSRF 保护,FlaskWTF 需要程序设置一个密钥。 Flask-WTF 使用这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪 。
#设置秘钥的方式:app.config['SECRET_KEY'] = '随便什么字符串'
表单类
使用flask_wtf时,每个表单都抽象成一个类,这个类继承自FlaskForm类,这个类定义了各种表单中的字段,每个字段都用对象表示。并且flask_wtf中还定义了各种验证函数,用来验证用户提交的输入值是否符合要求。
#首先构造一个html的原生表单<form method="post"> 用户名:<input type="text" name="username" /> <input type="submit" value="立即登录" /></form>#用flask_wtf构造一个同样的表单类:from flask_wtf import FlaskFormfrom wtforms import StringField, SubmitField #表单中的字段from wtforms.validators import DataRequired, ValidationError #验证方法class NameForm(FlaskForm): class NameForm(FlaskForm): name = StringField('用户名', validators=[DataRequired()]) submit = SubmitField('提交')
这个表单中的字段都定义为类变量,类变量的值是相应字段类型的对象。在这个示例中,NameForm 表单中有一个名为 name 的文本字段和一个名为 submit 的提交按钮。 StringField类表示属性为 type="text"
的 <input>
元素。 SubmitField 类表示属性为type="submit"
的<input>
元素。字段构造函数的第一个参数是把表单渲染成 HTML 时使用的标号。StringField 构造函数中的可参数 validators 指定一个由验证函数组成的列表,在接受用户提交的数据之前验证数据。验证函数 Required() 确保提交的字段不为空。
- WTForms支持的HTML标准字段:
+ WTForms 内建的验证函数
表4-2
把表单类渲染成HTML
在视图函数汇中实例一个表单类,然后把实例对象作为参数传入HTML就行渲染就可以变成HTML的表单
#假设是实例了一个名为form的实例{#原生渲染#}<form> {{ form.hidden_tag() }} {{ form.name.label() }}{{ form.name(id='xxx',class='yyy') }} {{ form.submit() }}</form>{# bootstrap渲染 #}{% extends 'bootstrap/base.html' %}{% import 'bootstrap/wtf.html' as wtf %}{% block content %} <div class="container">{{ wtf.quick_form(form) }}</div>{% endblock %}
表单校验
@app.route('/', methods=['GET', 'POST']) def index(): # 创建表单对象 form = NameForm() name = None # 表单校验 if form.validate_on_submit(): name = form.name.data form.name.data = '' # 渲染时分配到模板文件 return render_template('form.html', form=form, name=name)
POST重定向GET
@app.route('/', methods=['GET', 'POST']) def index(): # 创建表单对象 form = NameForm() # 表单校验 if form.validate_on_submit(): session['name'] = form.name.data return redirect(url_for('index')) name = session.get('name') # 渲染时分配到模板文件 return render_template('form.html', form=form, name=name)
### 自定义字段验证:
就是写一个’validate_字段’的函数,如下:
class NameForm(FlaskForm): name = StringField('用户名', validators=[DataRequired()]) submit = SubmitField('提交') # 自定义字段验证 def validate_name(self, field): if len(field.data) < 6: raise ValidationError('用户名长度不能少于6个字符')
flash消息显示
说明:
当用户发出请求后,有时状态发生了改变,需要给与提示、警告等信息时,通过可以弹出警告框,然后用户可以手动取消掉。
使用:
在合适的时候书写flash消息,使用flash函数
@app.route('/', methods=['GET', 'POST'])def index(): # 创建表单对象 form = NameForm() # 表单校验 if form.validate_on_submit(): last_name = session.get('name') # 原来有,并且与现在的不一样,给出提示消息 if last_name and last_name != form.name.data: flash('用户名已经改变') session['name'] = form.name.data return redirect(url_for('index')) name = session.get('name') # 渲染时分配到模板文件 return render_template('form.html', form=form, name=name)
在这个示例中,每次提交的名字都会和存储在用户会话中的名字进行比较,而会话中存储
的名字是前一次在这个表单中提交的数据。如果两个名字不一样,就会调用 flash() 函数,
在发给客户端的下一个响应中显示一个消息。仅调用 flash() 函数并不能把消息显示出来,程序使用的模板要渲染这些消息。最好在模板中渲染 Flash 消息,因为这样所有页面都能使用这些消息。 Flask 把 get_flashed_messages() 函数开放给模板,用来获取并渲染消息。
如下:
{% for message in get_flashed_messages() %}<div class="alert alert-warning alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button> {{ message }}</div>{% endfor %}
Flask_Moment
flask-moment
说明:这个扩展是一个时间本地化显示的库,依赖于Jquery。
安装:
pip install flask-moment
使用:
from flask_moment import Momentmoment = Moment(app)
模板使用
{% extends 'bootstrap/base.html' %}{% block content %}<div>时间日期:{{ moment(current_time).format('L') }}</div><div>私人定制:{{ moment(current_time).format('YYYY-MM-DD') }}</div><div>发表于:{{ moment(current_time).fromNow() }}</div>{% endblock %}{% block scripts %} {{ super() }} {# 原则上需要导入jquery,bootstrap已经导入,可以省略 #} {{ moment.include_jquery() }} {# 加载moment.js #} {{ moment.include_moment() }} {# 显示中文,默认显示英文 #} {{ moment.locale('zh-CN') }}{% endblock %}
- Flask笔记(3)--扩展包Flask-WTF,Flask-Moment
- Flask扩展: Flask-Moment
- flask-wtf
- Flask学习笔记-2-扩展bootstrap,moment
- Flask-Moment
- flask sqlalchemy wtf 使用笔记
- 细说flask表单flask-wtf
- Flask-WTF 示例
- Flask的WTF使用
- Flask 扩展: Flask-Script
- Flask扩展: Flask-Bootstrap
- Flask 扩展 Flask-Script
- Flask学习记录之Flask-WTF
- flask
- flask
- Flask
- Flask
- flask
- maven中设置阿里云仓库
- 如何快速有效基于Linux部署Java Web项目?
- js---js中的继承方法call、bind、apply,以及三者之间的区别总结。
- python
- C和指针之auto和内存栈和register关键字
- Flask笔记(3)--扩展包Flask-WTF,Flask-Moment
- 22.笔记 MySQL学习——Memory存储引擎
- centos7下hadoop环境搭建
- 674. Longest Continuous Increasing Subsequence
- vmware workstation 14 密钥
- 杭电oj 大鱼吃小鱼
- Apache2.4.23本地访问正常但局域网无法访问 httpd.conf设置
- Vue获取分发内容的宽度
- 机器学习理论篇之CNN 卷积神经网络