flask form表单验证
新建forms.py文件
#!/usr/bin/env python
#-*-coding:utf--*- #导入模块
from flask_wtf import FlaskForm #FlaskForm 为表单基类
from wtforms import StringField,PasswordField,SubmitField #导入字符串字段,密码字段,提交字段
from wtforms.validators import DataRequired,ValidationError
from models import Admin #从models导入模型(表) #定义登录表单,并且需要在视图函数(views.py)中实例化
class LoginForm(FlaskForm):
account = StringField(
# 标签
label="账号",
# 验证器
validators=[
DataRequired('请输入用户名')
],
description="账号",
# 附加选项,会自动在前端判别
render_kw={
"class":"form-control",
"placeholder":"请输入账号!",
"required":'required' #表示输入框不能为空,并有提示信息
}
) pwd = PasswordField(
# 标签
label="密码",
# 验证器
validators=[
DataRequired('请输入密码')
],
description="密码",
# 附加选项(主要是前端样式),会自动在前端判别
render_kw={
"class": "form-control",
"placeholder": "请输入密码!",
"required": 'required' # 表示输入框不能为空
}
) submit = SubmitField(
label="登录",
render_kw={
"class": "btn btn-primary btn-block btn-flat",
}
)
视图函数views.py
from . import adminbapp ##导入app
from flask import render_template,redirect,url_for,flash,session,request
from admin.forms import LoginForm #引入forms.py文件
from models import Admin #导入数据库模型
from functools import wraps #导入装饰器模块
from movie_project import db #引入sqlalchemy实例化对象 #登录验证装饰器
def login_required(func):
@wraps(func)
def decorated_function(*args, **kwargs):
if session.get('admin'): #验证session
return func(*args, **kwargs)
else:
return redirect(url_for('admin.login'))
return decorated_function
@adminbapp.route('/login/',methods=['GET','POST'])
def login():
forms = LoginForm() #实例化forms
if forms.validate_on_submit(): #提交的时候进行验证,如果数据能被所有验证函数接受,则返回true,否则返回false
data = forms.data #获取form数据信息(包含输入的用户名(account)和密码(pwd)等信息),这里的account和pwd是在forms.py里定义的
admin = Admin.query.filter_by(name=data["account"]).first() #查询表信息admin表里的用户名信息
if admin == None:
flash("账号不存在") #操作提示信息,会在前端显示
return redirect(url_for('admin.login'))
elif admin != None and not admin.check_pwd(data["pwd"]): #这里的check_pwd函数在models 下Admin模型下定义
flash("密码错误")
return redirect(url_for('admin.login'))
session['admin'] = data['account'] #匹配成功,添加session
return redirect(request.args.get('next') or url_for('admin.index')) #重定向到首页
return render_template('admin/login.html',form=forms)
数据库模型models.py
class Admin(db.Model):
__tablename= 'admin'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False, unique=True) # unique代表不能重复,唯一的
pwd = db.Column(db.String(100), nullable=False)
is_super = db.Column(db.SmallInteger) #是否为超级管理员
role_id = db.Column(db.Integer,db.ForeignKey('role.id'))
addtime = db.Column(db.DateTime, index=True, default=datetime.datetime.now) adminlogs = db.relationship('Adminlog',backref='admin')
adminoption = db.relationship('Oplogs', backref='admin') def __repr__(self):
return '<Admin %r>' % self.name
#定义密码验证函数
def check_pwd(self,pwd):
from werkzeug.security import check_password_hash #由于密码是加密的,所以要引入相应的加密函数
return check_password_hash(self.pwd,pwd)
前端 login.html
<div class="login-box-body">
{% for msg in get_flashed_messages() %} <!--这里对应视图函数里定义的提示信息 flash--> <p class="login-box-msg" style="color: red;">{{ msg }}</p> <!--信息在前端显示-->
{% endfor %}
<form method="POST" id="form-data"> <!--使用form,这里可以不用写action-->
<div class="form-group has-feedback">
{{ form.account }} <!--常规情况下,这里应该为一个input框,用来定义用户输入,由于在forms里已经定义,这里直接调用就行-->
<span class="glyphicon glyphicon-envelope form-control-feedback"></span>
{% for err in form.account.errors %} <!--错误信息-->
<div class="col-md-12"> <span style="color: red">{{ err }}</span> <!--显示错误信息-->
</div>
{% endfor %}
</div>
<div class="form-group has-feedback">
{{ form.pwd }} <!--同上面的用户输入-->
<span class="glyphicon glyphicon-lock form-control-feedback"></span>
{% for err in form.pwd.errors %} <!--pwd输入错误的提示信息-->
<div class="col-md-12">
<font style="color: red">{{ err }}</font>
</div>
{% endfor %}
</div>
<div class="row">
<div class="col-xs-8">
</div>
<div class="col-xs-4">
{{ form.submit }} <!--提交按钮-->
{{ form.csrf_token }} <!--csrftoken必须要写,同时还要设置 app的secret_key-->
</div>
</div>
</form>
</div>
配置secret_key
import os
app.config['SECRET_KEY'] = os.urandom(24)
实例之会员注册功能
forms.py表单文件
#!/usr/bin/env python
#-*-coding:utf-8-*- from flask_wtf import FlaskForm #FlaskForm 为表单基类
from wtforms import StringField,PasswordField,SubmitField #导入字符串字段,密码字段,提交字段
from wtforms.validators import DataRequired,ValidationError,Email,Regexp,EqualTo
from models import User class RegistUser(FlaskForm):
account = StringField(
# 标签
label="昵称",
# 验证器
validators=[
DataRequired('请输入昵称')
],
description="昵称",
# 附加选项,会自动在前端判别
render_kw={
"class":"form-control",
"placeholder":"请输入昵称",
#"required":'required' #表示输入框不能为空
}
) email = StringField(
label="邮箱",
# 验证器
validators=[
DataRequired('请输入邮箱'),
Email('邮箱格式不正确') #用Email方法验证邮箱格式
],
description="邮箱",
# 附加选项,会自动在前端判别
render_kw={
"class": "form-control",
"placeholder": "请输入邮箱!",
#"required": 'required' # 表示输入框不能为空
}
) phone = StringField(
label="手机",
# 验证器
validators=[
DataRequired('请输入手机号码'),
Regexp("1[3578]\d{9}", message="手机格式不正确") # 用正则匹配手机号码规则
],
description="手机",
# 附加选项,会自动在前端判别
render_kw={
"class": "form-control",
"placeholder": "请输入手机号码",
#"required": 'required' # 表示输入框不能为空
}
) pwd = PasswordField(
# 标签
label="密码",
# 验证器
validators=[
DataRequired('请输入密码')
],
description="密码",
# 附加选项,会自动在前端判别
render_kw={
"class": "form-control",
"placeholder": "请输入密码!",
#"required": 'required' # 表示输入框不能为空
}
) repwd = PasswordField(
# 标签
label="确认密码",
# 验证器
validators=[
DataRequired('确认密码'),
EqualTo('pwd',message="两次密码输入不一致") #判断两次输入的密码是否一致
],
description="确认密码",
# 附加选项,会自动在前端判别
render_kw={
"class": "form-control",
"placeholder": "确认密码",
#"required": 'required' # 表示输入框不能为空
}
)
submit = SubmitField(
label="注册",
render_kw={
"class": "btn btn-success btn-block",
}
) # 账号认证,自定义验证器,判断输入的值是否唯一
def validate_name(self, filed):
name = filed.data
account = User.query.filter_by(name=name).count()
if account == 1:
raise ValidationError("昵称已经存在") def validate_email(self, filed):
emails = filed.data
account = User.query.filter_by(email=emails).count()
if account == 1:
raise ValidationError("邮箱已经注册") def validate_phone(self, filed):
phones = filed.data
account = User.query.filter_by(phone=phones).count()
if account == 1:
raise ValidationError("手机号已经注册")
视图函数views.py
@homebapp.route("/register/",methods=['GET','POST'])
def register():
form = RegistUser() #实例化form if form.validate_on_submit(): #提交时
data = form.data
user = User(
name=data['account'],
email=data['email'],
phone = data['phone'],
pwd=generate_password_hash(data['pwd']),
uuid = uuid.uuid4().hex
)
db.session.add(user)
db.session.commit()
flash("注册成功",'ok')
return render_template("home/register.html",form=form)
models.py
class User(db.Model):
__tablename__ ="user"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(100),nullable=False,unique=True) #unique代表不能重复,唯一的
pwd = db.Column(db.String(100),nullable=False)
email = db.Column(db.String(64),nullable=False,unique=True)
phone = db.Column(db.String(11),nullable=False,unique=True)
info = db.Column(db.Text)
face = db.Column(db.String(100)) #头像
addtime = db.Column(db.DateTime,index=True,default=datetime.datetime.now)
uuid = db.Column(db.String(255)) userlogs = db.relationship('UserLog',backref='user') #外键关系关联
comments = db.relationship('Comment',backref='user')
movicols = db.relationship('Moviecol', backref='user') def __repr__(self): #定义返回的类型
return '<user %r>' % self.name def check_pwd(self,pwd): #验证密码
from werkzeug.security import check_password_hash
return check_password_hash(self.pwd,pwd)
前端register.html
<div class="panel-body">
{% for msg in get_flashed_messages(category_filter=['err']) %} <!--flash信息-->
<p style="color: red">{{ msg }}</p>
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['ok']) %}
<p style="color: green">{{ msg }}</p>
{% endfor %}
<form role="form" method="POST">
<fieldset>
<div class="form-group">
<label for="input_name"><span class="glyphicon glyphicon-user"></span> 昵称</label>
{{ form.account }}
</div>
{% for err in form.account.errors %}
<div class="col-md-12">
<span style="color: red">{{ err }}</span>
</div>
{% endfor %}
<div class="form-group">
<label for="input_email"><span class="glyphicon glyphicon-envelope"></span> 邮箱</label>
{{ form.email }}
</div>
{% for err in form.email.errors %}
<div class="col-md-12">
<span style="color: red">{{ err }}</span>
</div>
{% endfor %}
<div class="form-group">
<label for="input_phone"><span class="glyphicon glyphicon-phone"></span> 手机</label>
{{ form.phone }}
</div>
{% for err in form.phone.errors %}
<div class="col-md-12">
<span style="color: red">{{ err }}</span>
</div>
{% endfor %}
<div class="form-group">
<label for="input_password"><span class="glyphicon glyphicon-lock"></span> 密码</label>
{{ form.pwd }}
</div>
{% for err in form.pwd.errors %}
<div class="col-md-12">
<span style="color: red">{{ err }}</span>
</div>
{% endfor %}
<div class="form-group">
<label for="input_repassword"><span class="glyphicon glyphicon-lock"></span> 确认密码</label>
{{ form.repwd }}
</div>
{% for err in form.repwd.errors %}
<div class="col-md-12">
<span style="color: red">{{ err }}</span>
</div>
{% endfor %}
{{ form.csrf_token }}
{{ form.submit }}
</fieldset>
flask form表单验证的更多相关文章
- Form表单验证组件
Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Tyrion主要有两大重要动能: 表单 ...
- form表单验证-Javascript
Form表单验证: js基础考试内容,form表单验证,正则表达式,blur事件,自动获取数组,以及css布局样式,动态清除等.完整代码如下: <!DOCTYPE html PUBLIC &qu ...
- django之form表单验证
django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...
- python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)
python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...
- form表单验证2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作
一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...
- [php基础]PHP Form表单验证:PHP form validator使用说明
在PHP网站开发建设中,用户注册.留言是必不可少的功能,用户提交的信息数据都是通过Form表单提交,为了保证数据的完整性.安全性,PHP Form表单验证是过滤数据的首要环节,PHP对表单提交数据的验 ...
- django form表单验证
一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...
- Django中的Form表单验证
回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...
随机推荐
- 前端nginx+Java后台ftp处理页面图片上传踩坑
今天,将前端代码部署到服务器nginx上,在测试多图片上传时,报错413请求体空间太大,请求都没到后台,直接被nginx拦截,调整后又报错504. 整体而言,前端存在两处问题: 413 错误 :Req ...
- 第二十一天,pickle json xml shelve configparser模块
今日内容 1.pcikle 专用于python语言的序列化 2.json 是一种跨平台的数据格式 也属于序列化的一种方式 3.xml 可拓展标记语言 一种编写文档的语法 也支持跨平台 比较json而言 ...
- 洛谷P1916 小书童——蚂蚁大战
题目背景 小A在你的帮助下,开始“刷题”,他在小书童里发现了一款叫“蚂蚁大战”(又称蛋糕保卫战)的游戏.(你懂得) 题目描述 游戏中会出现n只蚂蚁,分别有a1,a2……an的血量,它们要吃你的蛋糕.当 ...
- 复习 LIS nlogn
参考:https://www.cnblogs.com/wxjor/p/5524447.html 最长下降只要把符号都倒过来就行 在栈中二分找第一个比当前值小的替换就行
- 学习Android过程中遇到的问题及解决方法——AS为xutils添加依赖
在使用xutils时遇到不能添加以来的问题,花了很长时间终于解决,网上添加依赖的方法很多,在此针对个人出现的问题作下笔记. 我本想使用jar包,因为在使用smartImageView时是用的jar包来 ...
- Matplotlib学习---用matplotlib和sklearn画拟合线(line of best fit)
在机器学习中,经常要用scikit-learn里面的线性回归模型来对数据进行拟合,进而找到数据的规律,从而达到预测的目的.用图像展示数据及其拟合线可以非常直观地看出拟合线与数据的匹配程度,同时也可用于 ...
- 用大O记号法测量算法的效率(Algorithm efficiency Asymptotic notation Big O notation)
为什么要了解算法的效率? 一般来说,编程就是把各种已知的算法代入到自己的代码当中,以此来解决问题.因此,了解各种算法的效率对于我们选择一个合适的算法有很大帮助. 算法的效率由什么确定? 从算法分析的理 ...
- Iroha and a Grid AtCoder - 1974(思维水题)
就是一个组合数水题 偷个图 去掉阴影部分 把整个图看成上下两个矩形 对于上面的矩形求出起点到每个绿点的方案 对于下面的矩形 求出每个绿点到终点的方案 上下两个绿点的方案相乘后相加 就是了 想想为什么 ...
- Hdoj 1176.免费馅饼 题解
Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁 ...
- 【Linux】linux正则表达式及通配符
正则表达式就是用于匹配每行输入的一种模式,模式是指一串字符序列.拥有强大的字符搜索功能.也非常方便的搜索过滤出我们想要的内容. linux正则表达式分为基本正则表达式(Basic Regexp)和扩展 ...