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, ...
随机推荐
- Vim和Neovim安装YouCompleteMe
确定支持Python,Vim一般支持,Neovim默认不支持 Vim的就不介绍方法了,很多系统都不一样.Neovim添加Python支持 pip install setuptools pip inst ...
- IIC协议理解(转)
目录 IIC协议理解(转) 个人小结记录 (记一下这个就够了) 以下为转载记录 概述 概述 输出级 主设备与从设备 速率 时序 空闲状态 起始位与停止位 数据的有效性 数据的传送 工作过程 主设备向从 ...
- JavaScript 函数递归
递归函数 递归函数是在一个函数通过名字调用自身的情况下构成的 项目中例如树状结构渲染,对象深复制,等很多方面都会使用到递归函数 function factorial(num){ if (num < ...
- Filebeat+ELK部署文档
在日常运维工作中,对于系统和业务日志的处理尤为重要.今天,在这里分享一下自己部署的Filebeat+ELK开源实时日志分析平台的记录过程,有不对的地方还望指出. 简单介绍: 日志主要包括系统日志.应用 ...
- cpp智能指针
weak_ptr<Cls1> wp1; { shared_ptr<Cls1> ptr1(new Cls1);//共享指针 wp1 = ptr1;//临时共享指针 std::co ...
- Linux Shell远程执行命令
1.问题描述 经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,下边介绍shell命令远程执行的方法. 前提: 远程电脑之间已经配置ssh免密码登陆 2.脚本方 ...
- win10下maven的安装与配置
下载apache-maven-3.5.3-bin.zip并解压: 环境配置: 系统环境:添加=>MAVEN_HOME 值为apache-maven-3.5.3的路径(D:\xxx\apache- ...
- JavaSE笔记-注释
Annotation Annotation是一个接口,可以把Annotation当成一个修饰符 Annotation的定义 注解通过@interface定义 public @interface Tes ...
- laravel5.4 向闭合函数内部传递参数
laravel 向闭合函数内部传入参数
- CF1153E Serval and Snake
题目地址:CF1153E Serval and Snake 这是一道交互题 由于只需要确定起点和终点 你选择的矩形会将整个矩形分成的两个部分 如果起点和终点在同一个部分里,那么很显然回答应该是个偶数 ...