首页 > 编程问答 >创建中间件后是否可以更新 FastAPI/Starlette SessionMiddleware 中的 max_age ?

创建中间件后是否可以更新 FastAPI/Starlette SessionMiddleware 中的 max_age ?

时间:2024-07-30 08:56:31浏览次数:10  
标签:python session fastapi middleware starlette

我需要限制某些用户的会话生命周期。 问题是,max_age是在创建中间件时设置的,之后似乎无法更新。

从中间件代码来看,似乎唯一的解决方案是创建一个具有所需的自定义中间件功能。有更好的解决方案吗?


你说的没错,FastAPI/Starlette 的 SessionMiddleware 在创建后不能直接更新 max_age 。 这是因为 max_age 在初始化时被用来设置 cookie 的 Max-Age 属性,之后这个属性就固定了。

解决方法:

虽然无法直接更新 max_age ,但你可以通过以下几种方法实现对某些用户会话生命周期的控制:

  1. 使用依赖注入 (Dependency Injection):

    • 创建一个依赖项函数,该函数根据用户身份返回不同的 max_age 值。
    • 在需要控制会话生命周期的路由函数中注入此依赖项。
    • 在依赖项函数中,你可以访问当前请求以及用户信息(例如,从数据库中获取)。

    ```python from fastapi import Depends, FastAPI, Request

    app = FastAPI()

    def get_max_age(request: Request): user = ... # 从数据库或其他地方获取用户信息 if user.is_admin: return 3600 * 24 # 管理员用户会话时间为1天 else: return 3600 # 普通用户会话时间为1小时

    @app.get("/some_route") def some_route(request: Request, max_age: int = Depends(get_max_age)): # ... 设置会话 request.session.update({"key": "value"}) response = JSONResponse({"message": "OK"}) response.set_cookie( key="session", value=request.session_id, max_age=max_age, # 使用依赖项函数返回的值 # ...其他cookie设置 ) return response ```

  2. 自定义中间件:

    • 创建一个自定义中间件,该中间件继承自 SessionMiddleware
    • 在自定义中间件的 __call__ 方法中,根据需要修改 cookie 的 Max-Age 属性。

    ```python from starlette.middleware.sessions import SessionMiddleware from starlette.responses import Response

    class CustomSessionMiddleware(SessionMiddleware): async def call (self, request: Request, call_next): response = await super(). call (request, call_next) if response.status_code == 200: # 仅在成功登录时修改cookie user = ... # 获取用户信息 if user.is_admin: max_age = 3600 * 24 else: max_age = 3600 response.set_cookie( key="session", value=request.session_id, max_age=max_age, # ...其他cookie设置 ) return response ```

  3. 手动管理会话:

  4. 不使用 SessionMiddleware ,选择自己管理会话,例如使用数据库或其他缓存机制。

  5. 这种方式更加灵活,但需要你自己实现会话的创建、读取、更新和删除等操作。

选择哪种方法取决于你的具体需求和项目复杂度。

  • 依赖注入方式比较简单易用,适合大多数情况。
  • 自定义中间件方式更灵活,可以实现更复杂的逻辑。
  • 手动管理会话方式最灵活,但也最复杂。

希望以上信息能够帮助你!

标签:python,session,fastapi,middleware,starlette
From: 78809421

相关文章

  • 即使使用 docker run -dit 命令,python-Docker 容器也会在运行两秒后退出
    我想从此处使用Dockerfile测试自定义kubernetes调度程序:FROMpython:3.7RUNpipinstallkubernetesCOPYscheduler.py/scheduler.pyCMDpython/scheduler.py一旦创建了映像和容器:dockerbuild-tapp.dockercontainerrun-d-it--namemy-sched......
  • Python多重处理,如何避免创建具有百万个对象的元组
    python多处理新手。我有一项任务,涉及访问网络服务数百万次并将响应保存在文件中(每个请求都有单独的文件)。我已经得到了高级工作代码,但对一些事情没有感到困惑。以下两种语法有什么区别?pool=Pool(processes=4)pool.starmap(task,listOfInputParametersTu......
  • Python OpenCV - 显示坏像素检查测试
    我想找到显示器中存在的每个坏像素。坏像素可能是颜色不正确的像素,或者像素只是黑色。显示屏的尺寸为160x320像素。所以如果显示效果好的话,必须有160*320=51200像素。如果显示器没有51200像素,那就是坏的。另外,我想知道每个坏像素的位置。一旦拍摄的图像太大,我将共享一个......
  • 在python日志输出的每一行前面添加变量缩进
    我正在将日志记录构建到一个Python应用程序中,我希望它是人类可读的。目前,调试日志记录了调用的每个函数以及参数和返回值。这意味着,实际上,嵌套函数调用的调试日志可能如下所示:2024-07-2916:52:26,641:DEBUG:MainController.initialize_componentscalledwithargs<control......
  • 使用 DQN 实现 pong,使用 python 中的特征向量而不是像素。我的 DQNA 实现代码正确吗,因
    我正在致力于使用OpenAI的Gym为Pong游戏实现强化学习(RL)环境。目标是训练人工智能代理通过控制球拍来打乒乓球。代理收到太多负面奖励,即使它看起来移动正确。具体来说,奖励函数会惩罚远离球的智能体,但这种情况发生得太频繁,即使球朝球拍移动时似乎也会发生。观察......
  • Python CDLL 无法加载两次
    我正在尝试用python创建一个密码管理器,但遇到了一个问题,一旦加载了一种类型的dll,我就无法加载不同的dll,在这个示例中,我加载了一个dll,并尝试解密加密的密码数据,它工作正常,直到我加载另一个不同的nss3.dll文件,此时它给我一个错误:“过程入口点HeapAlloc无法位于动态链......
  • 你能将 HTTPS 功能添加到 python Flask Web 服务器吗?
    我正在尝试构建一个Web界面来模拟网络设备上的静态接口,该网络设备使用摘要式身份验证和HTTPS。我想出了如何将摘要式身份验证集成到Web服务器中,但我似乎无法找到如何使用FLASK获取https,如果您可以向我展示如何实现,请评论我需要使用下面的代码做什么来实现这一点。from......
  • Python:比较 csv 文件并打印相似之处
    我需要比较两个csv文件并打印出它们的相似之处。第一个文件有名称和浓度,第二个文件就像只有名称的“最佳”列表,我需要绘制相似性图表。例如,这就是我的列表的样子:file1-old_file.csvname_id,conc_test1,conc_test2name1,####,####name2,###......
  • Python 类交叉引用
    我用Python创建了一个数独游戏。我有一个:单元格类-“保存”数字可能性单元格组-保存单元格类实例我使用这些组在数独中运行行、列和正方形功能。每个单元格包含所有组,他属于classCell:def__init__(groups):self.groups=groupscla......
  • 如何修复我的 Python Azure Function DevOps Pipeline 上的“找到 1 个函数(自定义)加载
    我正在尝试使用AzureDevOps构建管道将PythonAzureFunction部署到Azure门户。由于某种原因,代码被部署到服务器,但我在尝试访问端点时收到404错误。我收到一个错误,显示1functionsfound(Custom)0functionsloaded,以及在服务器上显示ModuleNotFound......