Flask Session 介绍
Posted Flask学习笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask Session 介绍相关的知识,希望对你有一定的参考价值。
HTTP Session
1.什么是Session
Session
中文翻译是会话.和Cookie
类似,它也是用来保存用户状态的.Cookie
有它的弊端,本身保存在客户端(如浏览器),而且是一个可读明文文件.这就意味着它很容易遭受伪装攻击(例如黑客B作为中间人伪造了A的Cookie
信息,发起转账服务).为了解决类似这样的问题,Session
被被开发使用.
Session
是一个思路/概念,一个服务器存储授权信息的解决方案,不同的服务器,不同的框架,不同的语言有不同的实现,虽然实现不一样,但是他们的目的都是服务器为了方便存储数据的.先来看一下
Cookie
是如何工作的(基于无状态的HTTP
协议).
Cookie
最常用用于登录和登出操作.下面以
浏览器先向 www.google.com
的服务器发送一个HTTP
请求.通常是一个POST
请求,包含用户名和密码.请求到达服务器后,服务器会验证用户的合法性.如果验证成功,服务器会给浏览器发送一个 Response with cookie
(通常是一个GUID
或者任何服务器的唯一标识)
Cookie
会放置在Response head
的Set-Cookie
字段中
浏览器在收到 Respnse with cookie
后,会把Cookie
保存在磁盘中(和Cookie
的过期时效有关)此后,如果用户在同一浏览器中的新标签页访问 www.google.com
,浏览器会在Response
中自动带上cookie
google.com
服务器在读到这个cookie
时会验证它的合法性.服务器通常都会在内存里维护一个所有它生成的Cookie
的字典.通常用sessionID
为键,UserID
或者其他标识用户信息的内容作为值.在认证完用户后,服务器就可以给用户发送自定义的动态页面.通常都包含该用户的特殊信息(如名字,头像,好友列表,活动订阅等等) 在基于
Cookie
的基础上,服务器返回的是不是简单的键值对,而是在服务器端生成Session
,它包含了Session_ID
用来唯一标识用户,并包含了生命周期等字段.
浏览器先向 www.google.com
的服务器发送一个HTTP
请求.通常是一个POST
请求,包含用户名和密码.请求到达服务器后,服务器会验证用户的合法性.如果验证成功,服务器会创建一个 Session
,它包含一个唯一标识用户的Session_ID
(它的值是一个既不会重复,又不容易找到规律的字符串),通常服务器会把Session_ID
和用户
的对应 保存在数据库中,如mysql adisMemcached
等等(他们都是保存在服务器本地的.)服务器给浏览器发送 Response with cookie
(cookie
中包含Session_ID
)浏览器在收到 Respnse with cookie
后,会把Cookie
保存在磁盘中.此后,如果用户在同一浏览器中的新标签页访问 www.google.com
,浏览器会在Response
中自动带上cookie
2.在Flask
中使用Session
在
Flask
的原生Session
中,并不是保存Session_ID
,而是将session
数据加密,然后存储在cookie
中.>>> from flask import session
>>> type(session)
<class 'werkzeug.local.LocalProxy'>
session
是一个类似字典的对象,它支持字典的操作方法(比如pop()/get()
等).在
Flask
中要使用session
,必须设置一个秘钥用于加密,为了更加安全,可以使用os.urange(24)
生成一个24位的随机字符串.它的简单示例如下(参考:https://github.com/ningwenyan/demo_code/tree/master/flask_demo_code/T19):
from flask import Flask
from flask import session,escape
from flask import request,redirect,url_for
import os
app = Flask(__name__)
app.config.update({
'DEBUG':True,
'TEMPLATES_AUTO_RELOAD':True,
# 使用session必须设置秘钥
'SECRET_KEY':os.urandom(24) # 生成24位随机数
})
# 也可以使用如下方法创建 secret_key
# app.secret_key=os.urandom(24)
@app.route('/')
def index():
if 'username' in session:
# escape 用来替换html中的16进制特殊符号
return 'Logged in as {}.<a href="/logout/">Logout</a>'.format(escape(session.get('username')))
return 'You are not logged in.<a href="/login/">Login</a>'
@app.route('/login/',methods=['GET','POST'])
def login():
if request.method == 'POST':
session['username'] = request.form.get('username')
return redirect(url_for('index'))
login_html = """
<form action="" method="POST">
<p><input type=text name=username></p>
<p><input type=submit value=Login></p>
</form>
"""
return login_html
@app.route('/logout/')
def logout():
"""删除 session"""
session.pop('username',None)
return redirect(url_for('index'))
if __name__ == '__main__':
app.run()以上基本包含了
session
的创建,读取和删除操作.删除所有的
session
可以使用session.clear()
.使用浏览器访问
http://127.0.0.1:5000
,可以查看session
的过程.
访问 http://127.0.0.1:5000
,此时并没有产生session
点击 login
后,GET
请求跳转到login
页面.没有生成session
填写用户名 submit
之后,使用POST
请求提交到服务器,服务器生成session
并加密返回cookie
,由于后台代码中有跳转到首页,它会跳转一次,但是会携带cookie
跳转.
点击 logout
后,登出系统,测试服务器删除session
3.session
设置超时时间.
如上,可以看到在服务器端
session
对cookie
做了一层封装.session
当然也支持过期时间操作.如果没有指定session的过期时间,那么默认是浏览器关闭后就自动结束.在
Flask
中,
通过设置 session.permanent=True
,这个参数会延长到31天.可以通过给 app.config
设置PERMANENT_SESSION_LIFETIME
来更改过期时间,这个值的数据类型是datetime.timedelay
类型.它一般用于登录页面的 记住我
选项.点击选项会设置更长的时间.from flask import Flask
from flask import session,escape
from flask import request,redirect,url_for
import os
from datetime import timedelta
app = Flask(__name__)
app.config.update({
'DEBUG':True,
'TEMPLATES_AUTO_RELOAD':True,
# 使用session必须设置秘钥
'SECRET_KEY':os.urandom(24), # 生成24位随机数
# 设置超时时间
'PERMANENT_SESSION_LIFETIME': timedelta(days=7)
})
# 也可以使用如下方法创建 secret_key
# app.secret_key=os.urandom(24)
@app.route('/')
def index():
if 'username' in session:
# escape 用来替换html中的16进制特殊符号
return 'Logged in as {}.<a href="/logout/">Logout</a>'.format(escape(session.get('username')))
return 'You are not logged in.<a href="/login/">Login</a>'
@app.route('/login/',methods=['GET','POST'])
def login():
if request.method == 'POST':
# 判断复选框是否有值
if request.form.get('remember'):
session['username'] = request.form.get('username')
session.permanent =True
return redirect(url_for('index'))
login_html = """
<form action="" method="POST">
<p><input type=text name=username></p>
<p><input type=submit value=Login></p>
<label for="">7 days remember me</label>
<input type="checkbox" name='remember' value="7 days remember me">
</form>
"""
return login_html
@app.route('/logout/')
def logout():
"""删除 session"""
session.pop('username',None)
return redirect(url_for('index'))
if __name__ == '__main__':
app.run()
4.session
存储在数据库中
- END -虽然
Flask
实现了session
,但是还是不能支持存储在数据库中.为什么要存储在数据库中,因为这样会更加安全.这就需要一个新的插件
Flask-Session
以上是关于Flask Session 介绍的主要内容,如果未能解决你的问题,请参考以下文章