Flask session

本文深入讲解Flask框架中Session的工作原理及使用方法,包括原始Session的实现与自定义Session的行为模式,探讨如何在Flask应用中有效管理和利用Session。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

session会话,是指将用户的信息存在服务器端.不同的框架有不同的实现方式.
在flask中,形式上是操作session对象,本质上还是将数据存在了cookie中
flask-session可以设置信息存在服务器的redis,或mysql,以及文件中.而在cookie中存一个key,用来查询

原理:

  • 请求刚到来:获取通过cookie随机字符串,存在则去“数据库”中获取原来的个人数据,否则创建一个空容器(flask中的session对象)。
  • 视图:操作内存中对象(随机字符串,{放置数据的容器})
  • 响应:内存对象(随机字符串,{放置数据的容器})
    - 将数据保存到“数据库”(这个数据库可以是客户端的cookie或者服务端的redis,mysql,mongo,file)
    - 把随机字符串写在用户cookie中

1.flask原始session

在实际应用中,我们只要在session中存储user_id,通过判断session中有没有user_id就可以判断用户是否登录

from flask import Flask, session

app = Flask(__name__)
app.config['SECRET_KEY'] = "123"  # 保存在客户端的cookie中,所以要求强制加密

@app.route('/get')
def index():
    name = session.get('name')
    pwd = session.get('pwd')
    print(pwd)
    return name or '没有session'

@app.route('/set')
def get_session():
    session['name'] = 'wang'
    session['pwd'] = '123'
    return '设置session!'

if __name__ == '__main__':
    app.run()


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.自定义session行为模式

重写app.session_interface即可,flask-session既是这样实现的

from flask import Flask,session
app = Flask(__name__)
app.secret_key = '123'

import json
class MySessionInterFace(object):
    def open_session(self,app,request):
        return {}
    def save_session(self, app, session, response):
        response.set_cookie('123',json.dumps(session))
    def is_null_session(self, obj):
        """Checks if a given object is a null session.  Null sessions are
        not asked to be saved.

        This checks if the object is an instance of :attr:`null_session_class`
        by default.
        """
        return False
app.session_interface = MySessionInterFace()

@app.route('/')
def index():
    session['xxx'] = 123
    return 'Index'
    
if __name__ == '__main__':
    app.run()

参考:
https://blog.youkuaiyun.com/feit2417/article/details/80735527

D:\PythonProject\.venv\Scripts\python.exe D:\PythonProject\app.py * Serving Flask app 'app' * Debug mode: on WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000 Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 120-624-777 This runs only once on the first request! 127.0.0.1 - - [10/Jun/2025 16:50:28] "GET / HTTP/1.1" 200 - 127.0.0.1 - - [10/Jun/2025 16:50:28] "GET /static/css/style.css HTTP/1.1" 404 - 127.0.0.1 - - [10/Jun/2025 16:50:28] "GET /static/js/main.js HTTP/1.1" 404 - 127.0.0.1 - - [10/Jun/2025 16:50:30] "GET /doctor_list?department=1&date=2025-06-10 HTTP/1.1" 500 - Traceback (most recent call last): File "D:\PythonProject\.venv\Lib\site-packages\flask\app.py", line 1536, in __call__ return self.wsgi_app(environ, start_response) ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\PythonProject\.venv\Lib\site-packages\flask\app.py", line 1514, in wsgi_app response = self.handle_exception(e) File "D:\PythonProject\.venv\Lib\site-packages\flask\app.py", line 1511, in wsgi_app response = self.full_dispatch_request() File "D:\PythonProject\.venv\Lib\site-packages\flask\app.py", line 919, in full_dispatch_request rv = self.handle_user_exception(e) File "D:\PythonProject\.venv\Lib\site-packages\flask\app.py", line 917, in full_dispatch_request rv = self.dispatch_request() File "D:\PythonProject\.venv\Lib\site-packages\flask\app.py", line 902, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ File "D:\PythonProject\app.py", line 64, in doctor_list flash(f'ID为 {department_id} 的科室不存在', 'warning') ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\PythonProject\.venv\Lib\site-packages\flask\helpers.py", line 335, in flash session["_flashes"] = flashes ~~~~~~~^^^^^^^^^^^^ File "D:\PythonProject\.venv\Lib\site-packages\flask\sessions.py", line 104, in _fail raise RuntimeError( ^ RuntimeError: The session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret. 127.0.0.1 - - [10/Jun/2025 16:50:30] "GET /doctor_list?__debugger__=yes&cmd=resource&f=style.css HTTP/1.1" 304 - 127.0.0.1 - - [10/Jun/2025 16:50:30] "GET /doctor_list?__debugger__=yes&cmd=resource&f=debugger.js HTTP/1.1" 304 - 127.0.0.1 - - [10/Jun/2025 16:50:30] "GET /doctor_list?__debugger__=yes&cmd=resource&f=console.png&s=v8WikeQeBL2PiowtaTJt HTTP/1.1" 200 -
最新发布
06-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值