Flask 的 session

  1. @app.route("/", )
  2. def index():
  3. # 如何设置sessoion
  4. # 1 导入session
  5. # 2 给sessoion设置值
  6. # 设置 session
  7. session['name'] = "santa"
  8. session["nam1"] = "kai"
  9. return "ok"
  10. @app.route("/login/")
  11. def login():
  12. # 获取 session
  13. # name = session.get('name')
  14. print(session["name"]) # santa
  15. return "login"
  16. if __name__ == '__main__':
  17. app.run()

分析 session 的原理

全局导入session,把session,当字典存值,取就当字典取值

原理之存session

当响应要返回给客户端时候,会调用 sesssion_interface 中的 save_session 法。把全局session字典做加密得到 val , 然后将这个 val 设置到 cookie 中。

cookie 的键为配置文件中的 session_cookie_name , 值就是我们session字典加密得到的结果

原理之取 session

当flask接收到请求的时候,会调用 sesssion_interface 中的 open_session 方法,该方法中从 cookie中取键为配置文件中 session_cookie_name 的 cookie 值,得到这个值以后呢,做解密。

然后赋值给全局的 session 字典。这样我们就可以取到之前 flask 设置 session

注意:用 session 必须配置 app.secret_key="随便"

  1. class SecureCookieSessionInterface(SessionInterface):
  2. salt = "cookie-session"
  3. digest_method = staticmethod(hashlib.sha1)
  4. key_derivation = "hmac"
  5. serializer = session_json_serializer
  6. session_class = SecureCookieSession
  7. def get_signing_serializer(self, app):
  8. if not app.secret_key:
  9. return None
  10. signer_kwargs = dict(
  11. key_derivation=self.key_derivation, digest_method=self.digest_method
  12. )
  13. return URLSafeTimedSerializer(
  14. app.secret_key,
  15. salt=self.salt,
  16. serializer=self.serializer,
  17. signer_kwargs=signer_kwargs,
  18. )
  19. # 取session的时候执行的
  20. def open_session(self, app, request):
  21. s = self.get_signing_serializer(app)
  22. if s is None:
  23. return None
  24. ##cookie键是SESSION_COOKIE_NAME"=session
  25. val = request.cookies.get(app.session_cookie_name)
  26. print("open_session.session_cookie_name,", app.session_cookie_name, )
  27. if not val:
  28. return self.session_class()
  29. max_age = total_seconds(app.permanent_session_lifetime)
  30. try:
  31. data = s.loads(val, max_age=max_age)
  32. print("self.session_class(data)", self.session_class(data) )
  33. return self.session_class(data)
  34. except BadSignature:
  35. return self.session_class()
  36. #存session的时候执行的
  37. def save_session(self, app, session, response):
  38. domain = self.get_cookie_domain(app)
  39. path = self.get_cookie_path(app)
  40. # If the session is modified to be empty, remove the cookie.
  41. # If the session is empty, return without setting the cookie.
  42. if not session:
  43. if session.modified:
  44. response.delete_cookie(
  45. app.session_cookie_name, domain=domain, path=path
  46. )
  47. return
  48. # Add a "Vary: Cookie" header if the session was accessed at all.
  49. if session.accessed:
  50. response.vary.add("Cookie")
  51. if not self.should_set_cookie(app, session):
  52. return
  53. httponly = self.get_cookie_httponly(app)
  54. secure = self.get_cookie_secure(app)
  55. samesite = self.get_cookie_samesite(app)
  56. expires = self.get_expiration_time(app, session)
  57. # 把session做了一个加密,把整个session的key--》val,全部加密,的到一个value值,
  58. #session是一个大字典,
  59. val = self.get_signing_serializer(app).dumps(dict(session))
  60. # 他把session加密后得到的val存到cookie里面了
  61. #cookie键是SESSION_COOKIE_NAME"=session
  62. print("源码中的session",dict(session))
  63. print("app.session_cookie_name,",app.session_cookie_name,)
  64. response.set_cookie(
  65. app.session_cookie_name,
  66. val,
  67. expires=expires,
  68. httponly=httponly,
  69. domain=domain,
  70. path=path,
  71. secure=secure,
  72. samesite=samesite,
  73. )

Flask 的 session的更多相关文章

  1. Flask的session——关于写扩展所学习到的

    这两天端午节.趁着端午节没事干,写了个flask的扩展--flask-RedisSession 在flask中使用该扩展可以让你借助redis数据库轻松获得server-side session. 这 ...

  2. Flask的session使用

    由于http是无状态保存的协议,session可以看作不同请求之间保存数据的一种机制.flask的session是基于cookie的会话保持. 流程 当客户端进行第一次请求的时候,客户端的HTTP r ...

  3. FLASK 的Session和MoudelForm插件

    falsk是小而精的框架,但是热度高, 所有很多爱好者提供了很多扩展插件 功能强大,美而不足的就是兼容稳定性有时候不太好,不过大部分还是很可以的 Flask-Session flask内置sessio ...

  4. 第六篇 flask中session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 Flask 中 session 的使用 1. Flask 中 session 是 ...

  5. Flask里面session的基本操作

    #session是依赖于flask的session模块 #如果想使用session模块,在配置里必须定义sessionkey from flask import Flask,session #建立对象 ...

  6. flask 的session

    python的flask操作设置.获得与删除session 首先讲一下Python的flask中session与cookies的关系,session是储存在服务器中的,cookies是储存在浏览器本地 ...

  7. Flask之session相关

    Flask的session简介 除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使 ...

  8. flask自定义session

    根据内置session原理可以进行session的定制: #!/usr/bin/env python # -*- coding:utf-8 -*- import uuid import json fr ...

  9. Flask 进阶session和上下文管理解析

    session的源码流程 将session放置在redis中 安装 pip install flask-session 使用 import redis from flask import Flask, ...

  10. Flask的session

    ### session:1. session的基本概念:session和cookie的作用有点类似,都是为了存储用户相关的信息.不同的是,cookie是存储在本地浏览器,session是一个思路.一个 ...

随机推荐

  1. keepalived的一些。。

    继续采坑..有些坑,踩了才知道. 1.文件位置不能错. 首先是安装, 源码编译,--prefix=/usr/local/keepalive 然后用 sbin/keepalive -f  ...conf ...

  2. jupyter notebook 修改前端样式

    目录 jupyter notebook主题 修改css和js 最终效果 jupyter notebook主题 作者的GitHub地址:https://github.com/dunovank/jupyt ...

  3. P4015 运输问题 最大/最小费用最大流

    P4015 运输问题 #include <bits/stdc++.h> using namespace std; , inf = 0x3f3f3f3f; struct Edge { int ...

  4. JavaScript Basic

    Exercise-1 Write a JavaScript program to display the current day and time in the following format. T ...

  5. Unity自定义Log

    有如下两种方式,第一种借助了Unity自身的LogType枚举型:第二种则是纯粹地自己定义: public class Log { public Log(string message, UnityEn ...

  6. MySQL知识-redis实例

    规划.搭建过程:6个redis实例,一般会放到3台硬件服务器注:在企业规划中,一个分片的两个分到不同的物理机,防止硬件主机宕机造成的整个分片数据丢失.端口号:7000-7005 # 1. 安装集群插件 ...

  7. 《Head First 设计模式》:策略模式

    正文 一.定义 策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户. 要点: 策略模式把系统中会变化的部分抽出来封装. 二.实现步骤 1.创建策略接口 ...

  8. [Wireshark]_003_电子邮件抓包分析

    电子邮件是我们的生活工作中经常使用的一种服务,用来联系世界各地的朋友,客户.下面我们就用Wireshark对电子邮件进行抓包. 准备工作: 邮件客户端一款(Outlook,Foxmail,KooMai ...

  9. sqlmap tamper脚本备忘录与tamper脚本编写

    查看sqlmap全部脚本 $ python sqlmap.py --list-tampers 使用方法 --tamper=TAMPER 2019.9更新后翻译 * apostrophemask.py- ...

  10. "锁定文件失败 打不开磁盘或它所依赖的某个快照磁盘。模块启动失败。未能启动虚拟机"--解决方法

    今天正在使用kali的时候,电脑突然死机了..强制重启,在进入虚拟机发现报错: "锁定文件失败 打不开磁盘或它所依赖的某个快照磁盘.模块启动失败.未能启动虚拟机." 1.问题起因 ...