Flask入门 表单Flask-wtf form原生 Bootstrap渲染(七)
(1) 原生的表单
模板页面,form表单form.html
<form action="{{ url_for('/check/') }}" method='post'>
<p>用户名: <input type='text' name='username'></p>
<p>密码: <input type='password' name='userpass'></p>
<p><input type='submit' value='submit'></p>
</form>
在manage.py中
#原生表单
@app.route('/form')
def form():
return render_template('form.html')
#获取原生表单提交的数据
@app.route('/check',method=['POST'])
def check():
print(request.form.get('userpass'))
print(request.form.get('username'))
return '提交数据'
#注: 第一个form函数仅仅是跳转页面作用,比较浪费因此我们可以合并一下
在manage.py中将路由函数合并
@app.route('/form')
def form():
if request.method == 'POST':
print(request.form.get('userpass'))
print(request.form.get('username'))
return render_template('/form.html')
(2) Flask-wtf表单
说明 : 是一个用于表单处理,校验并提供csrf验证的功能的扩展库
**安装 **:
sudo pip3 install flask-wtf
作用: Flask-wtf能保护所有表单免受跨站请求伪造的攻击(Cross-Site Request Forgery,CSRF),恶意网站会把请求发送到被攻击者登录的其他网站就会引起CSRF攻击,因此我们需要实现CSRF保护机制,Flask-wtf采用的做法是为程序设置一个秘钥,Flask-WTF 使用这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪。
app = Flask(__name__)
app.config['SECRET_KEY'] = 'sadad131[]'
#采用字典的方式存储框架,扩展和程序本身的配置变量,一般秘钥不直接写入代码,放在环境变量增加安全性.
flask-wtf一般自定义的表单类都是继承自Form类或者其子类,一般有表单类,验证器类
- 表单类主要有以下几种:
字段类型 | 字段说明 |
---|---|
StringField | 普通文本字段 |
TextAreaField | 多行文本字段 |
SubmitField | 提交 |
PasswordField | 密码字段 |
HiddenField | 隐藏文本字段 |
DateField | 日期字段 datetime.date(year=2018,month=2,day=20) 2018-02-20 |
DateTimeFiled | 时间字段 datetime.datetime(year=2018,month=2,day=20) 2018-02-20 00:00:00 |
IntegerField | 文本字段,值为整数 |
FloatField | 文本字段,值是浮点数 |
DecimalField | 文本字段,值为 decimal.Decimal |
BooleanField | 复选框,值为 True 和 False |
RadioField | 一组单选框 choices = [('w','女'),('m','男')] 参数1作为传递,参数2位显示值 |
SelectField | 下拉列表 choices参数确定了下拉选项, 是一个tuple组成的列表 (同上) |
SelectMultipleField | 下拉列表,可选择多个值 |
FileField | 文件上传字段 |
FormField | 把表单作为字段嵌入另一个表单 |
Validator是验证函数,把一个字段绑定验证函数之后,flask在接受表单之前会做一个验证 , 如果验证成功才会接收数据。验证函数Validator如下,
2 验证器一般有以下几种:
- 基本上每一个validator都有message参数,指出当输入数据不符合validator要求时显示什么信息
验证器函数 | 说明 |
---|---|
DataRequired/Required | 代表内容是必填项 DataRequired(message='用户信息不能为空') |
验证电子邮件地址,要求正则模式 : ^.+@([^.@][^@]+)$ |
|
EqualTo | 比较两个字段的值,常用于确认密码情况 EqualTo('要确认字段名',message='xxx') |
IPAddress | 验证IPV4网络地址 参数默认ipv4=True,ipv6=False |
Length | 验证输入字符串的长度 参数类型是字符串Length(min=6,max=30,message='个人信息的简介6-30个字') |
NumberRange | 验证输入的值在数字范围内NumberRange(min=6,max=90,message='年龄为6-90岁') |
Optional | 无输入值时跳过其他验证函数 |
Regexp | 使用正则表达式验证输入值 参数regex='正则模式' |
URL | 验证 URL URL(message='请输入正确的url地址')] 正则模式是^[a-z]+://(?P<host>[^/:]+)(?P<port>:[0-9]+)?(?P<path>\/.*)?$ |
AnyOf | 确保输入值在可选值列表中 |
NoneOf | 确保输入值不在可选值列表中 |
实例wtf表单
模板文件 form.html
<form action="{{ url_for('wtf_form') }}" method='post'>
{{ form.csrf_token }} #进入csrf验证
<p>{{ form.username.label }}{{ form.username(style='color:red',placeholder='请输入用户名') }}{{ form.username.errors }}</p>
<p>{{ form.userpass.label }}{{ form.userpass() }}{{ form.userpass.errors }}</p>
<p>{{ form.submit() }}</p>
</form>
#通过form.字段名获取对应字段属性 form.字段名(修饰符)
manage.py文件中
from flask import Flask,render_template,request
from flask_wtf import FlaskForm #导入继承父类
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import Length,DataRequired
class Login(FlaskForm): #继承自FlaskForm类
username = StringField('用户名',validators=[Length(min=6,max=12,message='用户名长度为6~12位'),DataRequired(message='用户名不能为空')])
userpass = PasswordField('密码',validators=[Length(min=6,max=12,message='密码长度为6~12位'),DataRequired(message='密码不能为空')])
submit = SubmitField('登录')
@app.route('/wtf_form',methods=['GET','POST'])
def wtf_form():
form = Login() #实例化form对象
if request.method == 'POST':
if form.validate_on_submit(): #数据正确 并且验证csrf通过
print(request.form.get('userpass'))
print(request.form.get('username'))
return '数据提交成功'
return render_template('wtf_form.html',form=form)
#注:
#1 methods 参数告诉Flask在URL映射中把这个视图函数注册为GET和POST请求的处理程序,默认GET
#2 采用post请求可以通过对象很轻松访问,GET 请求没有主体,提交的数据以查询字符串的形式附加到URL中
#3 validate_on_submit() 会调用username 字段上附属的 DataRequired() 验证函数。
注意: 1 form.validate_on_submit() 只有在数据正确 并且验证csrf通过 返回True
2 {{ form.csrf_token }} 进入表单 csrf 验证
(3) 使用bootstrap快速渲染
安装
pip3 install flask-bootstrap
视图函数:导入与实例
from flask_bootstrap import Bootstrap #导入
bootstrap = Bootstrap(app) #绑定bootstrap与该项目app的关系
导入 :基本用到的模板为 base.html 继承基类 和wtf.html 导入宏
{% import 'bootstrap/wtf.html' as wtf %} #导入重命名为wtf
{{ wtf.quick_form(form,url_for('index')) }} #访问宏wtf.quick_form('数据',路由)
{{ wtf.quick_form(form) }}
可以使用 Bootstrap 中预先定义好的表单样式渲染整个 Flask-WTF 表单。导入模板中的bootstrap/wtf.html 元素。定义了一个使用 Bootstrap 渲染 Falsk-WTF 表单对象的辅助函数。 wtf.quick_form() 函数的参数为 Flask-WTF 表单对象,使用 Bootstrap 的默认样式渲染传入的表单。
index.html
{ % extends "base.html" % } #继承base.html,必须写在最前面
{ % import "bootstrap/wtf.html" as wtf % } #重命名wtf
{ % block title % }首页{ % endblock % }
{ % block page_content % } #定义内容
<div class="page-header">
<h1>Hello, { % if username % }{{ username }}{ % else % }Stranger{ % endif % }!</h1>
</div>
{{ wtf.quick_form(form) }} #传入表单对象
{ % endblock % }
(4) 重定向和用户会话(Post/重定向/Get 模式)
基于Web程序把POST请求作为浏览器发送的最后一个请求,这种需求的实现方式是,使用重定向作为 POST 请求的响应,而不是使用常规响应。但是请求结束之后form.username.data接受的数据为用户输入的名字也就丢失了.因此我们采取将数据存储放在用户会话session中.
from flask import Flask,render_template,session,redirect,url_for
@app.route('/',methods=['GET','POST'])
def index():
form = Login()
if form.validate_on_submit(): #判断request是个带POST数据,且数据符合表单定义要求
session['username'] = form.username.data #将username保存到session
return redirect(url_for('index')) #重定向到'index视图函数路由'
return render_template('index.html',form=form,name=session.get['username'])
#注: <表单对象名>.<Field名称>.data 可以访问POST请求对应字段数据
(5) Flash消息
Flask的核心特性Flash实现: 为了解决用户提交了有一项错误的登录表单后,服务器发回的响应重新渲染了登录表单,并在表单上面显示一个消息,提示用户用户名或密码错误。常常用于表单信息提示.
flash()
作用是每次调用flash()都会触发一个消息所以可能有多个消息在排队等待显示。
get_flashed_messages()
函数获取传入的消息 其实就是一个列表, 获取的消息在下次调用时不会再次返回,因此 Flash 消息只显示一次,然后就消失了。
使用
from flask import flask,get_flashed_messages
@app.route('/register/',method=['GET','POST'])
def register():
form = Register()
if form.validate_on_submit():
flash('注册成功')
return redirect(url_for('index'))
return render_template('form.html',form=form)
在模板中获取
{% for message in get_flashed_messages() %}
<div class="alert alert-success alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span
aria-hidden="true">×</span></button>
<strong>success!</strong>{{ message }}
</div>
{% endfor %}
flash使用当然不仅仅限于单一消息的传递,flash的源码定义为 :
def flash(message, category='message'):
因此可以看到不仅能传递消息message
还能将传递的消息进行类别category
选择
get_flashed_messages同样有接受信息类别的属性with_categories=
设置为True
def get_flashed_messages(with_categories=False, category_filter=[]):
例如
if content.split('\n') <= 2:
flash(message=u'警告',category='warning')
elif content.split('\n') >= 5:
flash(message=u'不允许的操作',category='danger')
{% block content %}
{% for category,message in get_flashed_message(with_category=True) %}
<div class="alert alert-{{ category }} alert-dismissable">
<button type="button" class="close" data-dismiss="alert">&tims;</button>
{{ message }}
</div>
{% endfor %}
{% endblock %}
#按照分级信息弹出不同的显示框
Flask入门 表单Flask-wtf form原生 Bootstrap渲染(七)的更多相关文章
- flask提交表单验证不通过,以及CSRF攻击原理
学习表单的问题1. 提交表单时怎么都无法验证通过 记录一下,自己的学习bug,主要是因为在模板中书写渲染的语句时,把CSRF的字段名写错了. 因为在模板中书写一些语句是没有提示的,自己手动敲代码容易出 ...
- jQuery Form 表单提交插件----Form 简介,官方文档,官方下载地址
一.jQuery Form简介 jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery Form有两个核心方法 -- ajaxF ...
- Form表单插件jquery.form.js
常常使用到这个插件,但是老忘记怎么使用,现在对大家写的进行一定的整合. 使用插件实例: 一般的使用方法 <!-- 引入jquery文件 --> <script src="h ...
- jquery提交form表单插件jquery.form.js
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Flask 入门一( flask 框架和 flask-script 库)
Flask 入门一( flask 框架 和 flask-script 库) 一.Flask框架: 1.简介 Flask是一个非常小的Python Web框架,被称为微型框架:只提供了一个稳健的核心,其 ...
- jQuery插件 -- Form表单插件jquery.form.js<转>
jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery Form有两个核心方法 -- ajaxForm() 和 ajaxSubmi ...
- flask 后台表单验证模块
我不想直接用flask的wtf模块,太大,功能太多,用不了.但后台也不能不做验证吧,我比较懒,不想一行一行写代码验证,所以就写了一个验证模块,对于小项目也够用了 # encoding=utf-8 # ...
- flask之表单验证 2018.12.23
#flask的消息闪现依赖于flash库,用户发送的请求方式存储在request模块中 #跳转依赖于redirect模块,还可以通过url_for方法来进行方法上的寻址 from flask impo ...
- flask之表单
一:表单 表单用于注册,修改用户数据等场景. flask-wtf提供了一个包,可以创建表单:pip install flask-wtf 为了防止跨域请求,flask_wtf自己生成一个秘钥,用秘钥生成 ...
随机推荐
- [HAOI2015]按位或(FWT)
[Luogu3175] [BZOJ4036] [DarkBZOJ没有spj] 原理-shadowice 本题题解 我们要求的,实际上是一个集合\(n\)个\(1\)中最晚出现的\(1\)的期望时间 显 ...
- MySQL 简洁 数据操作 增删改查 记不住的 看这里把
1.库操作====================== 1.创建 CREATE DATABASE DB2 charset utf8; 2.删除 DROP DATABASE db2; 3.使用(进入) ...
- P3345 [ZJOI2015]幻想乡战略游戏
传送门 考虑先随便找一个点作为根,然后再慢慢移动根,这样一步步走到最优的点 设 $sum[x]$ 表示节点 $x$ 的子树的军队数,$len(x,y)$ 表示 $x,y$ 之间边的长度 那么对于根节点 ...
- 113th LeetCode Weekly Contest Largest Time for Given Digits
Given an array of 4 digits, return the largest 24 hour time that can be made. The smallest 24 hour t ...
- self_vue@1.0.0 dev: `webpack-dev-server --inline --progress --config build/webpack.dev.conf.js`
解决方案: 1.试一下 卸载npm uninstall webpack-dev-server,在安装这个npm i webpack-dev-server@2.9.7 2.删除node_modules目 ...
- 详解SimpleXML添加_修改_删除_遍历XML节点属性
SimpleXML概述 要处理XML 文件,有两种传统的处理思路:SAX 和DOM.SAX 基于事件触发机制,对XML 文件进行一次扫描,完成要进行的处理:DOM 则将整个XML 文件构造为一棵DOM ...
- Jsch初步
[From] http://xpenxpen.iteye.com/blog/2061869 上一篇文章我们成功搭建了sshd服务器,并通过3种方式登陆上了ssh.这一篇我们将用开源jar包jsch来登 ...
- docker 镜像编译
docker为我们提供了,包含源码的镜像, 可以要从docker hub上下载镜像来编译docker源码. 1. docker pull docker-dev:v1.2.0,其他版本就到docker ...
- PDFJs 在线预览插件
0.A.到官网 https://mozilla.github.io/pdf.js/getting_started/#download 下载最新版本B 部署到IIS 中访问 pdf.js/web/vie ...
- layer弹出层显示在top顶层
父页面 导入 layer.js 或者 layui.all.js,导入后就能正常显示在父窗口页面区域. 1.显示在顶层窗口 top.layer.open({ type: 2, area: ['98%', ...