Flask(六)—— 自定义session

  1. import uuid
  2. import json
  3. from flask.sessions import SessionInterface
  4. from flask.sessions import SessionMixin
  5. from itsdangerous import Signer, BadSignature, want_bytes
  6. class MySession(dict, SessionMixin):
  7. def __init__(self, initial=None, sid=None):
  8. self.sid = sid
  9. self.initial = initial
  10. super(MySession, self).__init__(initial or ())
  11. def __setitem__(self, key, value):
  12. super(MySession, self).__setitem__(key, value)
  13. def __getitem__(self, item):
  14. return super(MySession, self).__getitem__(item)
  15. def __delitem__(self, key):
  16. super(MySession, self).__delitem__(key)
  1. class MySessionInterface(SessionInterface):
  2. session_class = MySession
  3. container = {}
  4. def __init__(self):
  5. import redis
  6. self.redis = redis.Redis()
  7. def _generate_sid(self):
  8. return str(uuid.uuid4())
  9. def _get_signer(self, app):
  10. if not app.secret_key:
  11. return None
  12. return Signer(app.secret_key, salt='flask-session',
  13. key_derivation='hmac')
  14. def open_session(self, app, request):
  15. """
  16. 程序刚启动时执行,需要返回一个session对象
  17. """
  18. sid = request.cookies.get(app.session_cookie_name)
  19. if not sid:
  20. sid = self._generate_sid()
  21. return self.session_class(sid=sid)
  22. signer = self._get_signer(app)
  23. try:
  24. sid_as_bytes = signer.unsign(sid)
  25. sid = sid_as_bytes.decode()
  26. except BadSignature:
  27. sid = self._generate_sid()
  28. return self.session_class(sid=sid)
  29. # session保存在redis中
  30. # val = self.redis.get(sid)
  31. # session保存在内存中
  32. val = self.container.get(sid)
  33. if val is not None:
  34. try:
  35. data = json.loads(val)
  36. return self.session_class(data, sid=sid)
  37. except:
  38. return self.session_class(sid=sid)
  39. return self.session_class(sid=sid)
  40. def save_session(self, app, session, response):
  41. """
  42. 程序结束前执行,可以保存session中所有的值
  43. 如:
  44. 保存到resit
  45. 写入到用户cookie
  46. """
  47. domain = self.get_cookie_domain(app)
  48. path = self.get_cookie_path(app)
  49. httponly = self.get_cookie_httponly(app)
  50. secure = self.get_cookie_secure(app)
  51. expires = self.get_expiration_time(app, session)
  52. val = json.dumps(dict(session))
  53. # session保存在redis中
  54. # self.redis.setex(name=session.sid, value=val, time=app.permanent_session_lifetime)
  55. # session保存在内存中
  56. self.container.setdefault(session.sid, val)
  57. session_id = self._get_signer(app).sign(want_bytes(session.sid))
  58. response.set_cookie(app.session_cookie_name, session_id,
  59. expires=expires, httponly=httponly,
  60. domain=domain, path=path, secure=secure)
  1. # 使用时,需要先新进行配置:
  2. from flask import Flask
  3. from flask import session
  4. from pro_flask.utils.session import MySessionInterface
  5. app = Flask(__name__)
  6. app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
  7. app.session_interface = MySessionInterface()
  8. @app.route('/login.html', methods=['GET', "POST"])
  9. def login():
  10. print(session)
  11. session['user1'] = 'alex'
  12. session['user2'] = 'alex'
  13. del session['user2']
  14. return "内容"
  15. if __name__ == '__main__':
  16. app.run()
博客内容仅供参考,部分参考他人优秀博文,仅供学习使用

Flask(六)—— 自定义session的更多相关文章

  1. Flask中的session ,自定义实现 session机制, 和 flask-session组件

    session 是基于cookie实现, 保存在服务端的键值对(形式为 {随机字符串:'xxxxxx'}), 同时在浏览器中的cookie中也对应一相同的随机字符串,用来再次请求的 时候验证: 注意 ...

  2. Flask的插件session、SQLAlchemy、Script、Migrate

    一.flask-session 1.为什么要使用flask-session 因为flask默认的session是通过请求上下文放入到Local中的,是存在内存的,而使用flask-session可以更 ...

  3. flask基础之session原理详解(十)

    前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...

  4. Flask蓝图,Session,闪现,中间件等

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

  5. flask总结之session,websocket,上下文管理

    1.关于session flask是带有session的,它加密后存储在用户浏览器的cookie中,可以通过app.seesion_interface源码查看 from flask import Fl ...

  6. 将 flask 中的 session 存储到 SQLite 数据库中

    将 flask 中的 session 存储到 SQLite 数据库中 使用 flask 构建服务器后端时,常需要在浏览器端存储 cookie 用于识别不同用户,根据不同的 cookie 判断出当前请求 ...

  7. Flask笔记:session

    session与cookie: cookie是一项浏览器的技术,而不是服务器的技术,服务器端是无法直接操作cookie的,只能通过返回Response响应告诉浏览器怎么操作cookie.而sessio ...

  8. Flask基础之session验证与模板渲染语法(jinja2)

    目录 1.http传输请求头参数 2.Flask中request.data参数处理 3.Flask中request.json参数 4.Flask中的session管理 5.Flask中模板语法(if, ...

  9. Flask - 请求响应 | session | 闪现 | 请求扩展 | 中间件

    请求响应 flask的请求信息都在request里 flask的响应方式有四剑客,也可以自定义响应 请求相关信息 # request.method 提交的方法 # request.args get请求 ...

随机推荐

  1. 微信小程序中的自定义组件(components)

     其实小程序开发很像vue和react的结合,数据绑定和setData  重新渲染页面的数据,最近发现连写组件都是很像,也是醉了,自我认为哈, 因为小程序可以将页面内的功能模块抽象成自定义组件,以便在 ...

  2. iOS画线段

    CGContextRef context = UIGraphicsGetCurrentContext(); //设置线条类型 CGContextSetLineCap(context, kCGLineC ...

  3. 算法——得到数据流中前K大的数

    用优先队列 public PriorityQueue<Integer> kthLargest(int k, int[]a) { PriorityQueue<Integer> q ...

  4. 分组统计 over(partition by

    sum( CASE WHEN ISNULL(b.zl, 0) = 0 THEN C.LLZL ELSE b.zl END * c.pccd * b.sl) over(partition by b.dj ...

  5. python 线程模块

    Python通过两个标准库thread和threading提供对线程的支持.thread提供了低级别的.原始的线程以及一个简单的锁. threading 模块提供的其他方法: threading.cu ...

  6. Qt类图

    Qt对象命名与类图 QWidget=Windows get,即获得窗体,凡是我们能看到的界面都是从QWidget继承而来的. QDialog QAbstractButton 这是一个抽象类,不能直接使 ...

  7. 2018百度之星初赛A轮 度度熊拼三角

    #include<bits/stdc++.h> using namespace std; int n; int a[1005]; int main() {     int ans;     ...

  8. NBU5240备份系统还原数据库--Linux版

    利用NBU灾备系统数据库RMAN备份文件还原EHR数据库,将数据库还原到2017-7-10 10:00:00 linux centsos 6.6 原数据库版本 11.2.0.1  IP/hostnam ...

  9. Xdebug bad Zend API Version Number

    I am having trouble upgrading xdebug for MAMP. I was running version 2.2.0 and there was a known iss ...

  10. redis的安装及使用总结

    Windows版本的安装 下载地址:https://www.jb51.net/softs/541181.html 安装过程 把压缩包内的文件解压到非中文目录即可 启动redis 启动redis要通过命 ...