07.session与cookie
什么是cookie?
cookie:在网站中,HTTP请求是无状态的。也就是第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道请求的是哪个用户。cookie的出现是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4kb,因此使用cookie只能存储一些小量的数据
cookie有效期:服务器可以设置cookie的有效期,以后浏览器会自动的清除过期的cookie
cookie有域名的概念:只有访问同一个域名,才会把之前相同域名返回的cookie携带给服务器,也就是说,访问谷歌的时候,不会把百度的cookie发送给谷歌
cookie用法
set_cookie(self, key, value='',max_age=None, expires=None,path='/', domain=None,
secure=False, httponly=False,samesite=None)
secure设置为True只能在HTTPS协议下使用
httponly设置为True,cookie只能被浏览器读取,不能被js读取
expires无效日期
max_age:以秒为单位,距离现在多久过期
设置和删除cookie
设置
cookie
:设置cookie
在Response
对象上进行设置的,通过flask.Response
对象上的一个set_cookie()
方法来进行设置cookie
信息
@app.route('/')
def test_cookie():
response = Response("cookie")
response.set_cookie("A","B")
return response
删除
cookie
:通过flask.Response
对象上的一个delete_cookie()
方法来进行设置cookie
信息
# 删除指定cookie
resp.delete_cookie("name")
设置cookie过期时间
设置cookie的有效期,默认有效期:知道浏览器关闭为止
使用max_age参数设置有效期事件
# max_age:距离多少秒后cookie值过期
resp.set_cookie("name","value",max_age=10)
使用expires参数
1: expires = datetime(year=2018,month=7,day=14,hour=16,minute=29,second=0)
2: # 使用expires参数,就必须使用格林尼治时间
# 要相对北京时间少8个小时
expires = datetime(year=2018, month=7, day=14, hour=8, minute=29, second=0)
3: # 设置距离多久
expires = datetime.now() + timedelta(seconds=1) - timedelta(hours=8)
resp.set_cookie("name", "value", expires=expires)
注意:max_age在IE8以下的浏览器是不支持的。expires在新班的http协议中被废弃,但是到目前为止所有的浏览器都能够支持它
设置Cookie的有效域名
设置cookie
的有效域名:cookie
只能在主域名下使用。如果想要在子域名下使用,那么应该给"set_cookie"传递一个domain='.ty.com'
来指定其他子域名才能访问到这个cookie
信息。
定义蓝图
cms.py
from flask import Blueprint
cms_bp = Blueprint("cms",name,subdomain="cms")
@cms.route("/")
def index():
return "cms 首页"
注册蓝图
app.py
from cms import cms_bp
...
# 注册蓝图
app.register_blueprint(cms)
app.config["SERVER_NAME"] = "ty.com:5000"
....
地址映射:在hosts文件中添加以下映射
127.0.0.1 ty.com
127.0.0.1 cms.ty.com
设置set_cookie中的domain参数
resp = Response("name")
resp.set_cookie("name", "value",domain=".ty.com")
什么是session?
session
和cookie
的作用类似,都是为了存储用户相关的信息,不同的是,cookie
是存储在本地浏览器,session
是一个思路/概念,一个服务器存储授权信息的解决方案,不同的服务器,不同的框架,不同的语言有不同的实现,虽然实现不一样,但是他们的目的都是服务器为了方便存储数据的。session
的出现,是为了解决cookie
存储数据不安全的问题的
cookie和session结合使用
由于随着web的开发,发展至今,一般有两种存储方式:
存储在服务端:通过
cookie
存储一个session_id
,然后具体的数据则是保存在session
中。如果用户已经登录,则服务器会在cookie
中保存一个session_id
,下次再次请求的时候,会把session_id
携带上来,服务器根据session_id
在session库中获取用户的session
数据,就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session
。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器以及发展至今,一些session
信息还是可以存储的将
session
数据加密,然后存储在cookie
中。这种专业术语叫做client side session
。flask采用的就是这种方式,但是也可以替换成其他形式
session用法
设置session
设置session在session对象上进行设置的,通过flask.session
对象上的一个session.setdefault()
方法或者字典来进行设置session信息
session.setdefault("name","angle")
or
session["name"] = "angle"
获取session
通过session.get()
方法获取
name = session.get("name")
删除指定session
# 删除指定session
session.pop("name")
清除所有的session值
session.clear()
设置session有效期
通过配置config
进行设置,默认有效期为31天
from datetime import timedelta
# 设置会话有效期时间:两个小时以后会话有效期时间过期
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
# 设置session的过期时间,permanent:持久性,默认时间为一个月
session.permanent = True
注意,使用session需要配置SECRET_KEY
import os
# os.unrandom(n):产生24位的随机数
app.config["SECRET_KEY"] = os.urandom(24)
将session存储入redis中
安装
pip install flask-session
pip install redis
配置
from flask import Flask,request,session
from flask_session import Session
import redis,os
app = Flask(__name__)
app.config.update({
"SECRET_KEY":os.urandom(20), # 加密的密钥
"SESSION_USE_SIGNER" : True, # 是否对发送到浏览器上session的cookie值进行加密
"SESSION_TYPE" : "redis", # session类型为redis
"SESSION_KEY_PREFIX" : "session", # 保存到session中的值的前缀
"PERMANENT_SESSION_LIFETIME" : 7200, # 失效时间,单位秒
"SESSION_REDIS" : redis.Redis(host='127.0.0.1', port='6379', db=4) # redis数据库连接
})
# 实例化对象
sess = Session()
# 初始化
sess.init_app(app)
@app.route('/')
def index():
session['code'] = 'code'
return 'Redis Session'
if __name__ == '__main__':
app.run()
SECRET_KEY
加密的密钥
SESSION_USE_SIGNER
是否对发送到浏览器上session的cookie值进行加密
SESSION_TYPE
session类型为redis
SESSION_KEY_PREFIX
保存到session中的值的前缀
PERMANENT_SESSION_LIFETIME
失效时间,单位秒
SESSION_REDIS
redis数据库连接

redis客户端

最后更新于
这有帮助吗?