前言:本文是学习网易微专业的

《python全栈工程师 - Flask高级建站》

课程的笔记,欢迎学习交流。同时感谢老师们的精彩传授!

一、课程目标

表单数据接收

内置数据验证器

错误消息

自定义验证器

二、详情解读

2.1.表单数据接收

2.1.1.数据接收

通过

form

表单提交的数据可以使用

form.data

接收

form = LoginForm()

username = form.data['username']

form.data

会对表单提交的数据进行验证,数据转换

如果有一个表单字段是

Integer

类型,比如

score

,那么:

score = form.data['score']

相当于:

if "score" in request.form:

score = int(request.form['score'])

else:

score = 0

实操:

step

:修改

app.py

文件中的

login()

视图函数:

.

.

.

@app.route('/login', methods=['get', 'post'])

def login():

# 新增

form = LoginForm()

message = None

if request.method == "POST":

# 用户名和密码的数据接收用下面这两行代替

username = form.data['username']

password = form.data['password']

user = User.query.filter_by(username=username).first()

if user and user.validate_password(password):

session['user'] = user.username

# 登录成功返回首页

return redirect(url_for("index"))

else:

message = "用户名与密码不匹配"

return render_template("login.html", message = message,

form=form

)

.

.

.

2.2.数据验证器

2.2.1.数据验证的必要性

为什么要进行验证?

1.用户填写的时候不了解数据要求

2.别有用心的用户不择手段危害网站

验证手段:

1.前端验证,改进用户体验

2.后端验证,提升网站安全性

由于前端的任何验证都可以被忽略,所以永远不要相信前端提交来的数据是安全的。

2.2.2.flask-wtf提供的数据验证

验证器

说明

InputRequire(message)

必填字段

Length(min, max, message)

输入长度范围

NumberRange(min, max, message)

输入数值范围

Regexp(regex, flags, message)

正则表达式验证

Url(message)

输入字符串为合法的网址结构

Email(message)

输入必须为邮件地址

EqualTo(fieldname, message)

必须与fieldname的值一致

DateRequired(message)

输入有效性

FileRequired(message)

必须是文件

AnyOf(values, message)

输入值必须在values列表中

NoneOf(values, message)

输入值不在values列表中

实操:

修改

forms/account_form.py

文件中的

LoginForm()

为以下代码:

from flask_wtf import FlaskForm

from wtforms import StringField, PasswordField, SubmitField, SelectMultipleField, \

widgets, RadioField, TextAreaField,SelectField

from flask_ckeditor import CKEditorField

# 引入DataRequired模块

from wtforms.validators import DataRequired

class LoginForm(FlaskForm):

# 用户名和密码新增validtors验证器

username = StringField('用户名',

validators=[DataRequired(message="必须填写用户名")],

render_kw={"class": "form-control", "placeholder": "输入用户名"})

password = PasswordField('密码',

validators=[DataRequired(message="必须填写密码")],

render_kw={"class": "form-control", "placeholder": "输入密码"})

# 多选框选项

choices = [(1, "一周免登录"), (2, "二周免登录"), (3, "三周免登录")]

remember = CheckBoxField('记忆方式', choices=choices)

sex_choices = [(1, '女'), (2, '男')]

sex = RadioField('性别', choices=sex_choices)

# 这里第一个参数为空,因为登录按钮不用显示label的值

submit = SubmitField('', render_kw={"class": "btn btn-default", "value": "立即登录"})

.

.

.

经过以下修改后,用户登录表单的用户名和密码输入框就会多个

required

属性。

2.3.数据验证与错误显示

2.3.1.数据验证在视图函数中验证

form = LoginForm()

# if request.method == 'POST':

# 只有数据验证通过才会执行

if form.validator_on_submit():

pass

else:

print(form.errors)

2.3.2.表单错误输出

可以在前端页面中进行错误的输出显示,显示格式取决于前端设计。比如这里:

实操:

Step1

:替换

forms/account_form.py

文件中的

LoginForm()

为下面代码:

.

.

.

# 引入Length

from wtforms.validators import DataRequired, Length

.

.

.

class LoginForm(FlaskForm):

# 在验证器里新增Lenth长度验证

username = StringField('用户名',

validators=[DataRequired(message="必须填写用户名"),

Length(min=15, max=25, message="用户名长度6~15")],

render_kw={"class": "form-control", "placeholder": "输入用户名"})

password = PasswordField('密码',

validators=[DataRequired(message="必须填写密码")],

render_kw={"class": "form-control", "placeholder": "输入密码"})

# 多选框选项

choices = [(1, "一周免登录"), (2, "二周免登录"), (3, "三周免登录")]

remember = CheckBoxField('记忆方式', choices=choices)

sex_choices = [(1, '女'), (2, '男')]

sex = RadioField('性别', choices=sex_choices)

# 这里第一个参数为空,因为登录按钮不用显示label的值

submit = SubmitField('', render_kw={"class": "btn btn-default", "value": "立即登录"})

.

.

.

Step2

:修改

app.py

文件中的

login()

视图函数为下面代码:

.

.

.

@app.route('/login', methods=['get', 'post'])

def login():

form = LoginForm()

message = None

# 原来的判断是否是post,改为下面这个验证判断

if form.validate_on_submit():

username = form.data['username']

password = form.data['password']

user = User.query.filter_by(username=username).first()

if user and user.validate_password(password):

session['user'] = user.username

# 登录成功返回首页

return redirect(url_for("index"))

else:

message = "用户名与密码不匹配"

else:

print(form.errors)

return render_template("login.html", message = message,

form=form

)

.

.

.

Step3

:修改

templates/login.html

.

.

.

{% for field in form %}

{% if field.widget.input_type != "hidden" %}

{{field.label}}

{{field}}

{% if field.errors %}

×

Warning!

{{ field.errors }}

{% endif %}

{% else %}

{{field}}

{% endif %}

{% endfor %}

.

.

.

2.4.自定义数据验证器

2.4.1.内联验证器

内联验证器直接与字段绑定,在

form

定义类中定义:

class LoginForm(FlaskForm):

username = StringField("用户名", validators=[DataRequired()],...)

# 为usename定义一个验证器

def validate_username(form, field):

if field.data.find("admin") != -1:

raise ValidationError("不能包含敏感字")

实操:

Step1

:修改

forms/account_form.py

文件中的注册表单部分内容:

.

.

.

# 引入ValidationError模块

from wtforms.validators import ValidationError

# 注册表单

class RegisterForm(FlaskForm):

name = StringField('真实姓名',

render_kw={"class": "form-control", "placeholder": "请填写真实姓名"})

username = StringField('用户名',

validators=[DataRequired(message="必须填写用户名")],

render_kw={"class": "form-control", "placeholder": "请填写用户名"})

password = PasswordField('密码',

render_kw={"class": "form-control", "placeholder": "请填写密码"})

confirmpassword = PasswordField('确认密码',

render_kw={'class': 'form-control', "placeholder": "请填写确认密码"})

# 这里要加上coerce = int,不然会报错:Not a valid choice

sex = RadioField('选择性别',

choices=[(1, '男'), (0, '女')]

)

like = CheckBoxField('选择爱好',

choices=[(1, '钓鱼'), (2, '游泳'), (3, '看书'), (4, '旅游')],

render_kw={"class": "checkbox-inline"})

city = SelectField('选择城市', choices=[

('010', '北京'),

('021', '上海'),

('0512', '苏州'),

], render_kw={"class": "form-control"})

intro = TextAreaField('简介')

submit = SubmitField('', render_kw={"class": "btn btn-default", "value": "立即注册"})

# 新增内联验证器,验证用户名是否包含admin字符串

def validate_username(self, field):

# 查找用户名是否包含admin字符串

if field.data.find("admin") != -1:

raise ValidationError('不能包含敏感字')

Step2

:修改

views/users.py

中的

register()

视图函数:

.

.

.

# 引入 RegisterForm 注册表单模块

from forms.account_form import RegisterForm

user_app = Blueprint("user_app", __name__)

@user_app.route("/register", methods=['get','post'])

def register():

# 实例化注册表单

form = RegisterForm()

message = None

# 这里改为验证器提交判断,数据接收都改为form.data[]

if form.validate_on_submit():

if validate_username(form.data['username']):

return render_template("user/register.html", message="用户名重复")

realname = form.data['name']

username = form.data['username']

password = form.data['password']

sex = form.data['sex']

mylike = '|'.join(form.data['like'])

city = form.data['city']

intro = form.data['intro']

user = User(

realname=realname,

username=username,

sex=sex,

mylike=mylike,

city=city,

intro=intro

)

# 密码加密

user.hash_password(password)

try:

db.session.add(user)

db.session.commit()

return redirect(url_for('login'))

except Exception as e:

message = "注册失败:" + str(e)

else:

print(form.errors)

# 将form 注册表单传给前端模版

return render_template("user/register.html", message=message, form=form)

.

.

.

Step3

:替换

templates/user/register.html

内容为以下代码:

{% extends "base.html" %}

{% block content %}

用户注册

{% if message %}

{{ message }}

{% endif %}

{% for field in form %}

{# 隐藏域元素不用显示label #}

{% if field.widget.input_type!="hidden" %}

{{ field.label }}

{{ field }}

{% else %}

{{ field }}

{% endif %}

{% endfor %}

{% endblock %}

{% block footer %}

{{ super() }}

{{ ckeditor.config(name="intro")}}

{% endblock %}

网易微专业python全栈工程师_Python学习笔记:6.3.10 flash WTF数据验证,6310flaskwtf相关推荐

  1. 网易微专业python全栈工程师_Python 的工作已经饱和?那是因为你只会 Python

    原标题:Python 的工作已经饱和?那是因为你只会 Python 正如麦肯锡所说,数据已经渗透到现在的每一个行业中,成为重要的生产因素.各大公司对数据的重视度与日俱增,而随之一同增长的还有就业市场对 ...

  2. python工程师是什么专业-python全栈工程师是什么(需要会哪些东西)

    什么是Python全栈工程师? 即从前端页面的实现,到后台代码的编写,再到数据库的管理,一人可以搞定一个公司网站的所有事情,真正实现全栈开发. 全栈只是个概念 也分很多种类 真正的全栈工程师涵盖了we ...

  3. 【Python全栈100天学习笔记】Day37MySQL详解(sql语句基本操作含索引、视图、存储过程)

    SQL详解 基本操作 我们通常可以将SQL分为三类:DDL(数据定义语言).DML(数据操作语言)和DCL(数据控制语言).DDL主要用于创建(create).删除(drop).修改(alter)数据 ...

  4. 前端全栈工程师进阶学习笔记

    一,前端历史 先说一下前端的历史,前端是在2014年左右才开始兴起的,在这之前,受制于浏览器以及技术.兼容性等问题,导致网页的显示效果非常的单一,几乎都是静态页,前端的工作也是非常简单,说是前端,其实 ...

  5. 【Python全栈100天学习笔记】Day41 Django快速上手

    快速上手 Web开发的早期阶段,开发者需要手动编写每个页面,例如一个新闻门户网站,每天都要修改它的HTML页面,随着网站规模和体量的增大,这种方式就变得极度糟糕.为了解决这个问题,开发人员想到了用外部 ...

  6. 全栈工程师的学习笔记与工作记录

    转载:http://mp.weixin.qq.com/s?__biz=MjM5NDMwNjMzNA==&mid=204143894&idx=1&sn=d7fc1c0d595bb ...

  7. 匠人之心,成就真正Python全栈工程师

    Python行业现状 Python在2017年世界脚本语言排行榜中 Python排名第1,也是多领域首选语言,掌握了Python就是掌握了未来. Python人才需求量 世界编程语言排行榜之Pytho ...

  8. python全栈工程师薪水_python全栈+爬虫+自动化+AI=python全能工程师-挑战年薪30W+

    如果你想选择一种语言来入门编程,那么Python绝对是首选! Python非常接近自然语言,精简了很多不必要的分号和括号,非常容易阅读理解.编程简单直接,更适合初学编程者,让其专注于编程逻辑,而不是困 ...

  9. python全栈工程师薪水_Python工程师薪资待遇是多少?老男孩Python周末班

    从目前市场上的发展情况来说,Python是一门非常流行的编程语言,随着近几年的发展,Python这门语言变得更加流行了,也越来越火了,根据数据显示,Python发展已经翻了好几倍,是人工智能的头牌语言 ...

  10. python全栈工程师薪水_不止 20K,Python 工程师薪资再飙升(内附转型指南)

    原标题:不止 20K,Python 工程师薪资再飙升(内附转型指南) Python 诞生之初就被誉为最容易上手的编程语言.进入火热的 AI 人工智能时代后,它也逐渐取代 Java,成为编程界的头牌语言 ...

最新文章

  1. 多级联动下拉菜单插件:jquery.cxselect.js
  2. c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性
  3. 程序员的.NET时代
  4. python语音分割_用7行Python代码构建自己的有声读物
  5. Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)【Dalston版】
  6. golang c10k问题
  7. 注意!黑客可以通过CSS3功能攻击浏览器
  8. IntelliJ IDEA快速入门 | 第九篇:IntelliJ IDEA中的常用配置(一)——设置IntelliJ IDEA的主题
  9. 全拼到缩写月份单词python_英文中十二月份的全称和缩写
  10. 对比工具winMerge
  11. web网页设计期末课程大作业——简单的学生网页作业源码 基于HTML仿唯品会电商项目的设计与实现
  12. 【告别小白】什么是标志性语言?
  13. java动态心形程序_java swing实现动态心形图案的代码下载
  14. android开发者选项打开方式,打开、关闭安卓手机的开发者选项的方法详解
  15. 计算机技巧宣讲,PPT演讲技巧
  16. 23个带给你灵感的英文字体Logo设计欣赏
  17. 下载Mysql-connector-java驱动包
  18. win10重置此电脑卡在99%的解决方法(6种)
  19. 一个超酷的开源uHand2.0机械手掌项目
  20. 八大排序算法总结——Java篇

热门文章

  1. VUE系列——弹窗代码编写与调用弹窗过程详解
  2. java endian_java – 将小Endian文件转换成大Endian
  3. C语言实现系统日历查询系统
  4. brew 特别慢 解决方案
  5. android手机之-------64位操作系统 与 64位处理器
  6. php调用itunes,使用cURL和PHP检索iTunes App Store XML
  7. K8s(资源管理,namespace,Pod)
  8. Python QT5文件对话框总是错误代码-1073740791 (0xC0000409)
  9. java nio wakeup_Java NIO wakeup实现原理
  10. php解压7z,linux解压7z文件命令