LogoLogo
  • README
  • 前端编程
    • 01 Node JS
    • 02-ES6详解
    • 03-NPM详解
    • 04-Babel详解
    • 05-前端模块化开发
    • 06-WebPack详解
    • 07-Vue详解
    • 08-Git详解
    • 09-微信小程序
  • 人工智能
    • 机器学习
      • 二次分配问题
      • 非负矩阵
      • 概率潜在语义分析
      • 概率图模型
      • 集成学习
      • 降维
      • 距离度量
      • 决策树
      • 逻辑回归
      • 马尔可夫决策过程
      • 马尔可夫链蒙特卡洛法
      • 朴素贝叶斯法
      • 谱聚类
      • 奇异值分解
      • 潜在狄利克雷分配
      • 潜在语义分析
      • 强化学习
      • 社区算法
      • 时间序列模型
      • 特征工程
      • 条件随机场
      • 图论基础
      • 线性分类
      • 线性回归
      • 信息论中的熵
      • 隐马尔科夫模型
      • 支持向量机
      • 主成分分析
      • EM算法
      • Hermite 矩阵的特征值不等式
      • k-means聚类
      • k近邻法
      • PageRank算法
    • 深度学习
      • Pytorch篇
        • 01-线性模型
        • 02-梯度下降法
        • 03-反向传播
        • 04-pytorch入门
        • 05-用pytorch实现线性回归
        • 06-logistic回归
        • 07-处理多维特征的输入
        • 08-加载数据集
        • 09-多分类问题
        • 10-卷积神经网络
        • 11-循环神经网络
    • 图神经网络
      • 图神经网络笔记01
        • 01-图(Graphs)的结构
        • 02-网络的性质和随机图模型
        • 03-网络工具
        • 04-网络中的主题和结构角色
        • 05-网络中的社区结构
      • 图神经网络笔记02
        • 01-深度学习引言
        • 02-神经网络基础
        • 03-卷积神经网络
        • 04-图信号处理与图卷积神经网络
        • 05-GNN的变体与框架-
        • [06-Google PPRGo 两分钟分类千万节点的最快GNN](人工智能/图神经网络/图神经网络笔记02/06-Google%20PPRGo 两分钟分类千万节点的最快GNN.md)
        • 07-序列模型
        • 08-变分自编码器
        • 09-对抗生成网络
  • 日常记录
    • 健身日记
    • 面经记录
    • 自动生成Summary文件
  • 实战项目
    • 谷粒商城
      • 00-项目概述
      • 01-分布式基础-全栈开发篇
      • 02-分布式高级-微服务架构篇
      • 03-高可用集群-架构师提升篇
  • 数据库
    • MySQL笔记
      • 01-MySQL基础篇
      • 02-MySQL架构篇
      • 03-MySQL索引及调优篇
      • 04-MySQL事务篇
      • 05-MySQL日志与备份篇
    • Redis笔记
      • 01-Redis基础篇
      • 02-Redis高级篇
    • 02-Redis篇
  • 算法笔记
    • 01-算法基础篇
    • 02-算法刷题篇
  • 职能扩展
    • 产品运营篇
  • Go编程
    • 01-Go基础
      • 01-Go基础篇
  • Java编程
    • 01-Java基础
      • 01-Java基础篇
      • 02-多线程篇
      • 03-注射与反解篇
      • 04-JUC并发编程篇
      • 05-JUC并发编程与源码分析
      • 06-JVM原理篇
      • 07-Netty原理篇
      • 08-设计模式篇
    • 02 Java Web
      • 01-Mybatis篇
      • 01-Mybatis篇(新版)
      • 02-Spring篇
      • 02-Spring篇(新版)
      • 03-SpringMVC篇
      • 04-MybatisPlus篇
    • 03-Java微服务
      • 01-SpringBoot篇
      • 01-SpringBoot篇(新版)
      • 02-SpringSecurity篇
      • 03-Shiro篇
      • 04-Swagger篇
      • 05-Zookeeper篇
      • 06-Dubbo篇
      • 07-SpringCloud篇
      • 08-SpringAlibaba篇
      • 09-SpringCloud篇(新版)
    • 04-Java中间件
      • 数据库篇
        • 01-分库分表概述
        • 02-MyCat篇
        • 03-MyCat2篇
        • 04-Sharding-jdbc篇
        • 05-ElasticSearch篇
      • 消息中间件篇
        • 01-MQ概述
        • 02-RabbitMQ篇
        • 03-Kafka篇
        • 04-RocketMQ篇
        • 05-Pulsar篇
    • 05-扩展篇
      • Dubbo篇
      • SpringBoot篇
      • SpringCloud篇
    • 06-第三方技术
      • 01-CDN技术篇
      • 02-POI技术篇
      • 03-第三方支付技术篇
      • 04-第三方登录技术篇
      • 05-第三方短信接入篇
      • 06-视频点播技术篇
      • 07-视频直播技术篇
    • 07-云原生
      • 01-Docker篇
      • 02-Kubernetes篇
      • 03-Kubesphere篇
  • Linux运维
    • 01-Linux篇
    • 02-Nginx篇
  • Python编程
    • 01-Python基础
      • 01.配置环境
      • 02.流程控制
      • 03.数值
      • 04.操作符
      • 05.列表
      • 06.元祖
      • 07.集合
      • 08.字典
      • 09.复制
      • 10.字符串
      • 11.函数
      • 12.常见内置函数
      • 13.变量
      • 14.异常和语法错误
      • 15.时间和日期
      • 16.正则表达式
    • 02 Python Web
      • flask篇
        • 01.前言
        • 02.路由
        • 03.模板
        • 04.视图进阶
        • 05.flask-sqlalchemy
        • 06.表单WTForms
        • 07.session与cookie
        • 08.上下文
        • 09.钩子函数
        • 10.flask 信号
        • 11.RESTFUL
        • 13.flask-mail
        • 14.flask+celery
        • 15.部署
        • 16.flask-login
        • 17.flask-cache
        • 18.flask-babel
        • 19.flask-dashed
        • 20.flask-pjax
        • 21.flask上传文件到第三方
        • 22.flask-restless
        • 23.flask-redis
        • 24.flask-flash
        • 25.消息通知
        • 26.分页
    • 03-Python数据分析
      • Matplotlib
      • Numpy
      • Pandas
      • Seaborn
    • 04-Python爬虫
      • 1.准备工作
      • 2.请求模块的使用
      • 3.解析模块的使用
      • 4.数据存储
      • 5.识别验证码
      • 6.爬取APP
      • 7.爬虫框架
      • 8.分布式爬虫
由 GitBook 提供支持
在本页
  • 什么是cookie?
  • cookie用法
  • 设置和删除cookie
  • 设置cookie过期时间
  • 设置Cookie的有效域名
  • 什么是session?
  • cookie和session结合使用
  • session用法
  • 设置session
  • 获取session
  • 删除指定session
  • 清除所有的session值
  • 设置session有效期
  • 注意,使用session需要配置SECRET_KEY
  • 将session存储入redis中
  • 安装
  • 配置
  • redis客户端

这有帮助吗?

在GitHub上编辑
  1. Python编程
  2. 02 Python Web
  3. flask篇

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信息。

  1. 定义蓝图

cms.py

from flask import Blueprint

cms_bp = Blueprint("cms",name,subdomain="cms")

@cms.route("/")
def index():   
	return "cms 首页"  
  1. 注册蓝图

app.py

from cms import cms_bp
...
 # 注册蓝图  
app.register_blueprint(cms) 
app.config["SERVER_NAME"] = "ty.com:5000" 
....
  1. 地址映射:在hosts文件中添加以下映射

127.0.0.1 ty.com
127.0.0.1 cms.ty.com
  1. 设置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客户端

上一页06.表单WTForms下一页08.上下文

最后更新于3年前

这有帮助吗?

image-20200906054235652

image-20200906060142893
下载
image-20200905072844719