FLASK 的Session和MoudelForm插件
falsk是小而精的框架,但是热度高,
所有很多爱好者提供了很多扩展插件
功能强大,美而不足的就是兼容稳定性有时候不太好,不过大部分还是很可以的
Flask-Session
flask内置session式写在浏览器上的,感觉和其他框架不太一样,
现在学习一个写在后台的session
现在我想写在redis中,怎么操作呢
- 先要下载包 : flask-session
- from flask import Flask, render_template
- from flask import views # 导入视图模块
- from flask import session
- from flask_session import Session # 导入Session类
- from redis import Redis
- app = Flask(__name__, static_folder="static")
- # # # # # # 配置 # # # # # # # #
- red = Redis("127.0.0.1", , db=) # 实例化Redis连接
- app.config["SESSION_TYPE"] = "redis" # key大写,value小写!!!
- app.config["SESSION_REDIS"] = red # 指定连接是Redis实例,让session执行写入redis的方法
- Session(app) # 添加配置
- # FBV
- @app.route('/')
- def index():
- session["key"] = "strong_key"
- print(session) # <RedisSession {'_permanent': True, 'key': 'strong_key'}>
- # 浏览器观察key是 session :8a1561f9-800c-4f03-be69-2ea336c39d39
- # redis中 通过"session:8a1561f9-800c-4f03-be69-2ea336c39d39"获取到value是
- # "\x80\x03}q\x00(X\n\x00\x00\x00_permanentq\x01\x88X\x03\x00\x00\x00keyq\x02X\n\x00\x00\x00strong_keyq\x03u."
- return "this's index"
- # CBV
- class LoginClass(views.MethodView):
- def get(self):
- return render_template("login.html")
- def post(self):
- return "ok"
- app.add_url_rule("/login", view_func=LoginClass.as_view("login"))
- app.run(debug=True, host="127.0.0.1", port="")
seesion_py文件
源码大概意思
需要配置的
WTForms - MoudelForm
后端写页面render到前端的组件
学过django应该了解form组件
flask中的第三方库WTForms功能是类似的
开始写一个简单的登录注册吧。。
没有拆分,直接写在一个app上了
- from flask import Flask, render_template, request
- from flask import views # 导入视图模块
- from wtforms.fields import simple, core
- from wtforms import Form
- from wtforms import validators
- app = Flask(__name__, static_folder="static")
- # # # # # # # # # # # # # # # # # # # #
- # # # # # # MoudelFrom组件 # # # # #
- # # # # # # # # # # # # # # # # # # # #
- class LoginForm(Form):
- username = simple.StringField(
- label="用户名",
- validators=[
- validators.DataRequired(message="不能为空"),
- validators.Length(min=, max=, message="不能小于3位,不能大于5位")
- ],
- render_kw={"class": "my_username"}
- )
- password = simple.PasswordField(
- label="密码",
- validators=[
- validators.DataRequired(message="不能为空"),
- validators.length(min=, max=, message="密码必须是6位"),
- validators.Regexp(regex="\d+", message="密码必须是数字")
- ],
- render_kw={"class": "my_pwd"}
- )
- # 注册页面的form
- class RegForm(Form):
- username = simple.StringField(
- label="用户名",
- validators=[
- validators.DataRequired(message="不能为空"),
- validators.Length(min=, max=, message="不能小于3位,不能大于6位")
- ],
- # render_kw={""} 不写了默认class:这个字段(username)
- )
- password = simple.PasswordField(
- label="密码",
- validators=[
- validators.DataRequired(message="不能为空"),
- validators.Length(min=, message="密码不能小于6"),
- validators.Regexp(regex="\d+", message="密码必须位数字"),
- ],
- render_kw={"class": "reg_pwd"}
- )
- re_password = simple.PasswordField(
- label="重复密码",
- validators=[
- validators.EqualTo(fieldname="password", message="两次密码不一致")
- ]
- )
- email = simple.StringField(
- label="邮箱",
- validators=[
- validators.Email(message="格式不正确")
- ],
- )
- # 性别 单选
- gender = core.RadioField(
- label="性别",
- coerce=int,
- choices=(
- (, "男"), (, "女"), (, "保密")
- ),
- default=
- )
- # 爱好 多选
- hobby = core.SelectMultipleField(
- label="爱好",
- coerce=int,
- choices=(
- (, "小姐姐"),
- (, "小萝莉"),
- (, "小哥哥"),
- (, "小正太"),
- (, "阿姨"),
- (, "大叔"),
- ),
- default=(, )
- )
- submit = simple.SubmitField(
- label="提交"
- )
- # FBV
- @app.route('/')
- def index():
- return "this's index"
- # CBV
- class LoginClass(views.MethodView):
- def get(self):
- login_form = LoginForm()
- return render_template("login.html", lf=login_form)
- def post(self):
- login_form = LoginForm(request.form)
- if login_form.validate():
- return ""
- else:
- return render_template("login.html", lf=login_form)
- class RegClass(views.MethodView):
- def get(self):
- rf = RegForm()
- return render_template("reg.html", rf=rf)
- def post(self):
- rf = RegForm(request.form)
- if rf.validate():
- return ""
- else:
- return render_template("reg.html", rf=rf)
- app.add_url_rule("/login", view_func=LoginClass.as_view("login"))
- app.add_url_rule("/reg",view_func=RegClass.as_view("reg"))
- app.run(debug=True, host="127.0.0.1", port="")
app.py文件
html页面
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta http-equiv="content-Type" charset="UTF-8">
- <meta http-equiv="x-ua-compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Title</title>
- </head>
- <body>
- <form action="" method="post" novalidate>
- {{ lf.username.label }}{{ lf.username }}{{ lf.username.errors. }}
- <p>{{ lf.password.label }}{{ lf.password }}{{ lf.password.errors. }}</p>
- <input type="submit" value="提交">
- </form>
- </body>
- </html>
login.html
- <head>
- <meta http-equiv="content-Type" charset="UTF-8">
- <meta http-equiv="x-ua-compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Title</title>
- </head>
- <body>
- <form action="" method="post">
- {% for field in rf %}
- <p>{{ field.label }}{{ field }}{{ field.errors. }}</p>
- {% endfor %}
- </form>
- </body>
- </html>
reg.html
FLASK 的Session和MoudelForm插件的更多相关文章
- Flask中session实现原理
前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...
- Flask的session——关于写扩展所学习到的
这两天端午节.趁着端午节没事干,写了个flask的扩展--flask-RedisSession 在flask中使用该扩展可以让你借助redis数据库轻松获得server-side session. 这 ...
- Flask的session使用
由于http是无状态保存的协议,session可以看作不同请求之间保存数据的一种机制.flask的session是基于cookie的会话保持. 流程 当客户端进行第一次请求的时候,客户端的HTTP r ...
- 第六篇 flask中session
Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 Flask 中 session 的使用 1. Flask 中 session 是 ...
- Flask里面session的基本操作
#session是依赖于flask的session模块 #如果想使用session模块,在配置里必须定义sessionkey from flask import Flask,session #建立对象 ...
- flask 的session
python的flask操作设置.获得与删除session 首先讲一下Python的flask中session与cookies的关系,session是储存在服务器中的,cookies是储存在浏览器本地 ...
- Flask之session相关
Flask的session简介 除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使 ...
- flask自定义session
根据内置session原理可以进行session的定制: #!/usr/bin/env python # -*- coding:utf-8 -*- import uuid import json fr ...
- Flask 进阶session和上下文管理解析
session的源码流程 将session放置在redis中 安装 pip install flask-session 使用 import redis from flask import Flask, ...
随机推荐
- 【Noip2015】斗地主
题目 #include<bits/stdc++.h> using namespace std; int pai[20],T; //pai[]统计牌的数量 int n; int ans; v ...
- Java斗地主案例、异常和自定义异常整理
模拟斗地主洗牌发牌 1.1 案例介绍 按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张 ...
- 常见Web攻击
一.SQL注入 1. sql注入的危害 非法读取.篡改.删除数据库中的数据 盗取用户的各类敏感信息,获取利益 通过修改数据库来修改网页上的内容 注入木马等 2. 实例 MYSQLDB # 通过在用户名 ...
- 069、Calico的默认连通性(2019-04-12 周五)
参考https://www.cnblogs.com/CloudMan6/p/7536746.html Calico 跨主机连通性测试 root@host1:~# docker exec bbo ...
- C# GetHashCode在x64与x86版本下不一样
最好指定一下目标平台
- [物理学与PDEs]第5章习题5 超弹性材料中客观性假设的贮能函数表达
设超弹性材料的贮能函数 $\hat W$ 满足 (4. 19) 式, 证明由它决定的 Cauchy 应力张量 ${\bf T}$ 满足各向同性假设 (4. 7) 式. 证明: 若贮能函数 $W$ 满足 ...
- 使用select为描述符设置超时
int readable_timeo(int fd, int sec) { fd_set rset; struct timeval tv; FD_ZERO(&rset); FD_SET(fd, ...
- dense prediction问题
dense prediction 理解:标注出图像中每个像素点的对象类别,要求不但给出具体目标的位置,还要描绘物体的边界,如图像分割.语义分割.边缘检测等等. 基于深度学习主要的做法有两种: 基于图 ...
- 练习:javascript-setInterval动画运动平移,定时器动画练习
常见问题:定时器加速问题,每次点击会启动一个定时器,解决先清除定时器 <!DOCTYPE html> <html lang="en"> <head&g ...
- LeetCode前100题(EASY难度)
1 Two Sum Given an array of integers, return indices of the two numbers such that they add up to a s ...