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, ...
随机推荐
- Linux端口被占用的解决(附Python专版)
先说一般情况的解决: lsof -i:8000 查出PID,然后 kill掉程序,接着就可以了 软件重启之后绑定没有释放,lsof -i:8080也查不出来占用的情况 再来个长连接版Python解决法 ...
- (转)史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!
背景:因为自己的简历写了dubbo,面试时候经常被问到.实际自己对dubbo的认识只停留在使用阶段,所以有必要好好补充下基础的理论知识. https://zhuanlan.zhihu.com/p/45 ...
- a标签跳页传参,以及截取URL参数
<a href="dd.index?aa=1&&bb=2"></a> //截取URL参数 // console.log(window.loc ...
- 通过命令修改mysql的提示符
在cmd窗口操作mysql数据库的时候,前面的提示符永远都是mysql>,这个提示符可以通过命令修改. 在登录mysql时修改: mysql -uroot -p --prompt 提示符 登录后 ...
- UOJ #311「UNR #2」积劳成疾
需要锻炼$ DP$能力 UOJ #311 题意 等概率产生一个长度为$ n$且每个数在[1,n]间随机的数列 定义其价值为所有长度为$ k$的连续子数列的最大值的乘积 给定$ n,k$求所有合法数列的 ...
- JAVA进阶13
间歇性混吃等死,持续性踌躇满志系列-------------第13天 1.查看线程的运行状态 package code0327; class Demo01 implements Runnable { ...
- Web从入门到放弃<8>
Ref: Cameron D. - HTML5, JavaScript and jQuery (Programmer to Programmer) - 2015 http://www.runoob.c ...
- Saltstack自动化操作记录(2)-配置使用
之前梳理了Saltstack自动化操作记录(1)-环境部署,下面说说saltstack配置及模块使用: 为了试验效果,再追加一台被控制端minion机器192.168.1.118需要在master控制 ...
- Linux下间隔多少秒 (即以秒为单位) 去执行某条命令或某个shell脚本的操作方法【转】
在日常运维工作中, 经常会碰到以秒为单位去定时执行某些命令或监控脚本的需求. 说到定时任务就要用到crontab,通常来说,crontab的最小单位是分钟级别,要想实现秒级别的定时任务,就要进行特殊设 ...
- Linux -- Centos6 yum安装相关问题与处理
Centos6 yum安装相关问题与处理 由于要使用yum下载文件,突然yum下载不了想要的文件,想更换yum源,结果得重新安装yum 来自本人GitHub地址https://github.com/m ...