Flask学习3:表单
文章目录
[隐藏]
- flask-表单
- 原生表单
- flask-wtf
- flash消息
- flask-moment
flask-表单
原生表单
1.添加模板文件login.html
<form method="post" action="{{ url_for('check') }}"> 用户名:<input type="text" name="username"> <input type="submit" value="登陆"> </form>
2.视图函数
# 登陆 @app.route('/login/', methods=['GET', 'POST']) def login(): return render_template('login.html') # 校验 @app.route('/check/', methods=['GET', 'POST']) def check(): return '登陆成功, %s~' % request.form['username']
3.将登陆页面和校验的路由合并
@app.route('/login/', methods=['GET', 'POST']) def login(): if request.method == 'GET': return render_template('login.html') return '登陆成功, %s~' % request.form['username']
一个路由处理时,表单的action属性不用书写
flask-wtf
1.说明
是一个用于表单处理的扩展库,提供了CSRF、校验等功能,使用非常方便。
2.安装
pip install flask-wtf
3.使用
# 原生渲染 # 导入表单基类 from flask_wtf import FlaskForm # 导入相关类型 from wtforms import StringField, SubmitField # 导入验证器 from wtforms.validators import DataRequired # CSRF需要 app.config['SECRET_KEY'] = 'idandan' # 定义表单类 class NameForm(FlaskForm): name = StringField('账号:', validators=[DataRequired()]) submit = SubmitField('登陆') @app.route('/formTest/') def formTest(): # 创建表单对象 form = NameForm() return render_template('formTest.html', form = form) # html <form> {{ form.hidden_tag() }} {{ form.name .label()}} {{ form.name(id = 'username', class = 'username') }} {{ form.submit }} </form> # bootstrap渲染 # 设置bootstrap本地库中的文件 app.config['BOOTSTRAP_SERVER_LOCAL'] = True # html {% extends 'bootstrap/base.html' %} {# 导入 #} {% import 'bootstrap/wtf.html' as wtf %} {% block title %} 表单渲染 {% endblock %} {% block content %} <div > {{ wtf.quick_form(form) }} > {% endblock %}
4.表单校验
@app.route('/formTest/', methods=['GET', 'POST']) def formTest(): # 创建表单对象 form = NameForm() # return render_template('formTest.html', form = form) # return render_template('bootForm.html', form = form) # 表单校验 name = None if form.validate_on_submit(): name = form.name.data form.name.data = '' return render_template('bootForm.html', form = form, name = name) # html {% extends 'bootstrap/base.html' %} {# 导入 #} {% import 'bootstrap/wtf.html' as wtf %} {% block title %} 表单渲染 {% endblock %} {% block content %} <h4> Hi, {% if name %} {{ name }}! {% else %} Stranger! {% endif %} </h4> <div > {{ wtf.quick_form(form) }} > {% endblock %}
5.POST重定向GET
@app.route('/formTest/', methods=['GET', 'POST']) def formTest(): # 创建表单对象 form = NameForm() # 表单校验 name = None if form.validate_on_submit(): session['name'] = form.name.data form.name.data = '' return redirect(url_for('formTest')) name = session.get('name') return render_template('bootForm.html', form = form, name = name)
6.常见的字段类型
7.常见验证器类
8.自定义字段验证
# 定义表单类 class NameForm(FlaskForm): name = StringField('账号:', validators=[DataRequired()]) submit = SubmitField('登陆') # 自定义字段验证函数,格式是写一个‘valudate_字段名’函数 def validate_name(self, field): if len(field.data) < 6: raise ValidationError('账号长度不能小于6个字符')
flash消息
1.说明
当用户请求发出后,用户状态发生了改变,需要给出提示、警告等信息时,通常可以通过弹窗的形式给出指示,用户可以跟据提示进行下一步操作,也可手动取消显示。
2.使用
在合适的时候书写flash消息,调用flash函数
@app.route('/formTest/', methods=['GET', 'POST']) def formTest(): # 创建表单对象 form = NameForm() # return render_template('formTest.html', form = form) # return render_template('bootForm.html', form = form) # 表单校验 name = None if form.validate_on_submit(): oldName = session.get('name') if oldName is not None and oldName != form.name.data: flash('Change your name!') session['name'] = form.name.data return redirect(url_for('formTest')) name = session.get('name') return render_template('bootForm.html', form = form, name = name) # html {% for message in get_flashed_messages() %} <h3>{{ message }}</h3> {% endfor %}
若好多页面都有弹出消息,可以将flash消息放在基础模板中展示。
flask-moment
1.说明
专门负责时间本地化显示的扩展库,使用非常方便 。
2.安装
pip install flask-moment
3.使用
# 导入类库 from flask_moment import Moment # 创建对象 moment = Moment(app) from datetime import datetime, timedelta @app.route('/moment/') def moment(): current_time = datetime.utcnow() + timedelta(seconds=-3600) # 伪造时间 return render_template('moment.html', current_time=current_time) # HTML {#{% extends 'bootstrap/base.html' %}#} {% block content %} <div > <h4>时间本地化显示</h4> <h3>距离:{{ moment(current_time).fromNow() }}</h3> <h3>时间:{{ moment(current_time).format('LLLL') }}</h3> > {% endblock %} {#加载jquery和moment,因为moment.js需要依赖,使用bootstrap时就不需要再加载jquery#} {{ moment.include_jquery() }} {{ moment.include_moment() }}
原文出处:csdn -> https://blog.csdn.net/qq_25046261/article/details/78914312
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。