一.Flask_session

本质上,就是是cookie 下的session存储在redis中,方便快速取得session

from flask import Flask,session
from flask_session import Session
from redis import Redis app=Flask(__name__)
#这两个是必须填写的,在session源码中,
'''
if config['SESSION_TYPE'] == 'redis':
session_interface = RedisSessionInterface(
config['SESSION_REDIS'], config['SESSION_KEY_PREFIX'],
config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT'])
''' app.config['SESSION_TYPE'] = "redis"
app.config["SESSION_REDIS"]=Redis(host='127.0.0.1',port=6379,db=6) Session(app)
@app.route("/")
def index():
session["user"]="value"
return "hello"
if __name__ == '__main__':
app.run(debug=True) #查看进入redis redis-cli
#选择db select db的序号
#存储在redis get session:c0cdc66b-3ef0-4d0c-8030-a37f14be7e5d

二.WTForms

本质上就是通过进行类的继承关系快速生成一张form表单,在前端通过后端发送的实例化对象点出他的属性

from flask import Flask, render_template,request
from wtforms import simple, core
from wtforms import validators
from wtforms import Form app=Flask(__name__)
'''
源码 进行覆盖
def __init__(self, label=None, validators=None, filters=tuple(),
description='', id=None, default=None, widget=None,
render_kw=None, _form=None, _name=None, _prefix='',
_translations=None, _meta=None):
''' class LoginForm(Form):
username=simple.StringField( #生成的input标签的name:username
label="用户名", #字段
validators=[
validators.DataRequired(message="用户不能为空"),
validators.Length(min=3,max=12,message="不是长了就是断了") ], #校验条件
id="user_id", #input标签的id
default=None, #默认值,当发生select时的默认选择
widget=None, # 默认组件(input type="text") 在StringField中已经被实例化了
render_kw={"class":"my_login"} #input标签下的类class=my_login )
# 这里PasswordField是继承StringField的 区别在于PasswordField是密文的
password=simple.PasswordField( label="密码",
validators=[
validators.DataRequired(message="用户不能为空"),
validators.Length(min=3, max=12, message="不是长了就是断了"),
validators.Email(message="密码必须符合邮箱规则") ],
id="user_pwd",
default=None,
widget=None,
render_kw={"class": "my_login"} ) class RegForm(Form):
username=simple.StringField(
label="用户名",
validators=[
validators.DataRequired(message="用户名不能为空"),
validators.Length(min=3, max=8, message="用户名不是长了就是短了")
])
password=simple.PasswordField(
label="密码",
validators=[
validators.DataRequired(message="密码不能为空"),
validators.Length(min=3, max=16, message="密码不是长了就是短了"),
validators.Email(message="密码必须符合邮箱规则")
]) repassword=simple.PasswordField(
label="确认密码",
validators=[validators.EqualTo(fieldname="password",message="未确认眼神")]) gender=core.RadioField( #单选 core下的RadioField
label="性别",
coerce=str,
choices=(("","女"),
("","男")
),
default="" )
hobby=core.SelectMultipleField( #多选 core下的SelectMultipleField
label="爱好",
validators=[validators.Length(min=2,max=4,message="癖好有问题")],
coerce=int,
choices=((1,"food"),(2,"eat"),(3,"swim"),(4,"joke"),(5,"love")
),
default=(1,2,3)
) @app.route("/",methods=["GET","POST"])
def index():
if request.method=="GET":
fm = LoginForm()
return render_template("index.html",wtf=fm)
else:
new_fm=LoginForm(request.form)
if new_fm.validate():
return new_fm.data.get("username")
else:
return render_template("index.html",wtf=new_fm)
@app.route("/reg",methods=["GET","POST"])
def reg():
if request.method=="GET":
rf = RegForm()
return render_template("reg.html",rf=rf)
else:
rf = RegForm(request.form)
if rf.validate():
return rf.data.get("password")
else:
return render_template("reg.html",rf=rf) if __name__ == '__main__':
app.run(debug=True)

前端

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post" novalidate>
{{ wtf.username.label }}
{{ wtf.username }}
<p>
<h2>{{ wtf.username.errors.0 }}</h2></p>
<p>
{{ wtf.password.label }}
{{ wtf.password }} </p>
<p>
<h1>
{{ wtf.password.errors.0 }}
</h1>
</p>
<input type="submit" value="登录"> </form>
</body>
</html>

flask flask_session,WTForms的更多相关文章

  1. Flask插件wtforms、Flask文件上传和Echarts柱状图

    一.wtforms 类比Django的Form组件Form组件的主要应用是帮助我们自动生成HTML代码和做一些表单数据的验证 flask的wtforms用法跟Form组件大同小异参考文章:https: ...

  2. flask 之cbv ,flash闪现,Flask_Session,WTForms - MoudelForm

    1.CBV : from flask import views  class LoginView(views.MethodView):  def get(self):   return     def ...

  3. Flask的WTforms

    一.简单介绍 WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 类似于Django中的modelform 安装: pip3 install wtforms 二.简 ...

  4. 85、flask之wtforms

    本篇导航: wtforms组件的使用 自定义From组件 一.wtforms组件的使用 1.flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进 ...

  5. flask之wtforms

    本篇导航: wtforms组件的使用 自定义From组件 一.wtforms组件的使用 1.flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进 ...

  6. Flask之wtforms源码分析

    一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...

  7. 【Flask】WTForms基本使用

    # WTForms笔记:这个库一般有两个作用.第一个就是做表单验证,把用户提交上来的数据进行验证是否合法.第二个就是做模版渲染. ### 做表单验证:1. 自定义一个表单类,继承自wtforms.Fo ...

  8. 11,flask之--WTForms

    WTForms是什么? 相当于django的ModelForm. 在网页中,为了和用户进行信息交互总是不得不出现一些表单.flask设计了WTForm表单库来使flask可以更加简便地管理操作表单数据 ...

  9. flask之wtforms 表单验证(一)

    一  安装wtforms pip install wtforms 二  导入相关模块及对象 from wtforms import Form, widgets, validators from wtf ...

随机推荐

  1. 第九周周二总结&&第九周周三计划

    周二的主题提取使用LDA模型进行了简单的测试,效果还可以.主要是提取的分词的结果,LDA:随机生成文章各个主题比例,再根据各个主题随机生成词,词与词之间的顺序关系被彻底忽略了,这就是LDA眼中世间所有 ...

  2. Fink| CEP

    什么是复杂事件CEP? 一个或多个由简单事件构成的事件流通过一定的规则匹配,然后输出用户想得到的数据,满足规则的复杂事件. 特征: 目标:从有序的简单事件流中发现一些高阶特征 输入:一个或多个由简单事 ...

  3. PMP132种工具与技术

    <PMBOK ® 指南>第六版中共包括 132 种工具与技术 <PMBOK ® 指南>使用了以下工具与技术分组:1.数据收集技术.用于从各种渠道收集数据与信息.共有9 种数据收 ...

  4. LeetCode 733: 图像渲染 flood-fill

    题目: 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. An image is represented by a 2-D array of int ...

  5. STS 重写父类方法的操作

    本来这种东西真的没什么好写的,但是很多时候真的是要用到的,不知道的话自己手动敲,会累死人的.所以记录在这里,自己的笔记,有需要的赶紧拿去,省的手动录入那么辛苦. 在代码窗口点击右键,依次选择“Sour ...

  6. [线段树]区间修改&区间查询问题

    区间修改&区间查询问题 [引言]信息学奥赛中常见有区间操作问题,这种类型的题目一般数据规模极大,无法用简单的模拟通过,因此本篇论文将讨论关于可以实现区间修改和区间查询的一部分算法的优越与否. ...

  7. class net.sf.cglib.core.DebuggingClassWriter overrides final method visit

    在使用CGLIB进行动态代理的时候,报了[java.lang.VerifyError: class net.sf.cglib.core.DebuggingClassWriter overrides f ...

  8. WinForm 程序在系统托盘显示

    前言 有些程序在关闭或最小化的时候会隐藏在系统托盘中,双击或右击会重新显示,winform实现其功能很简单,这边就简单的介绍下. 实现 在winform实现托盘使用notifyIcon控件,如果加菜单 ...

  9. Spring源码系列 — 注解原理

    前言 前文中主要介绍了Spring中处理BeanDefinition的扩展点,其中着重介绍BeanDefinitionParser方式的扩展.本篇文章承接该内容,详解Spring中如何利用BeanDe ...

  10. MySQL分析数据运行状态利器【show full processlist】

    原文地址:https://www.cnblogs.com/shihuc/p/8733460.html 今天的主角是: SHOW [FULL] PROCESSLIST show full process ...