Skip to content

feat: bump to 4.3.0 and support django async - #306

Merged
piglei merged 5 commits into
TencentBlueKing:masterfrom
piglei:support-async
Aug 12, 2026
Merged

feat: bump to 4.3.0 and support django async#306
piglei merged 5 commits into
TencentBlueKing:masterfrom
piglei:support-async

Conversation

@piglei

@piglei piglei commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator
  • feat: bump to 4.3.0 and support django async
  • replace requests with httpx2

@piglei
piglei requested review from narasux and wklken August 11, 2026 10:23
@narasux

narasux commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

Review:bkpaas-auth 4.3.0(Django async + httpx2)

整体结论:可以合。这是一次以「Django 原生 async + httpx2」为主线的能力升级;同步路径大体兼容,设计质量高,测试覆盖到位。合并前建议在 CHANGES 里补清依赖层破坏说明。


1. 新功能清单

能力 落点 说明
Middleware 双模 CookieLoginMiddleware / UserTimezoneMiddleware sync_capable + async_capable;脱离 MiddlewareMixin
Auth Backend 异步 UniversalAuthBackend / DjangoAuthUserCompatibleBackend aauthenticate / aget_user;HTTP 走 async_request_user_account
对外用户查询 API async_get_user_by_user_id() 与同步 API 对称
HTTP 层 http_get / async_http_get + Client 池 进程级 sync Client;按 event loop 缓存 AsyncClient
用户信息 / Token 异步 async_get_*_user_infoasync_request_user_account cache.aget/aset + async HTTP;解析逻辑与同步共享
Monkey patch 异步 auth.aget_user = aget_user patch_middleware_get_user() 注入 request
扩展钩子 async_configure_user / async_connect_to_django_user 覆盖 configure_user 的项目在 ASGI 下也需覆盖对应异步方法

价值: Cookie 认证主链(middleware / Universal&DjangoAuth backend / HTTP / cache / session)在 ASGI 下可走原生 async,避免 Django 再把同步中间件 sync_to_async 包一层。


2. 对存量功能的影响

业务配置级:基本兼容MIDDLEWARE / AUTHENTICATION_BACKENDS、同步 API 签名、BKAUTH_REQUESTS_* 配置名均保留)。

变更 影响 说明
requestshttpx2 依赖 / 测试层 升级后需改依赖;单测里 patch("requests.Session.request") 会失效,应改为 httpx2.Client.request 或 patch 库内 http_get
删除 get_requests_session() 外部若直接引用需适配;CHANGES 建议显式写一句
Middleware 不再继承 MiddlewareMixin 低~中 仅影响依赖 Mixin 行为的子类化用法
全局默认 HTTP 超时 Timeout(30, connect=5) 低(行为收紧) Token 路径仍可 per-request timeout=10;对认证关键路径方向正确
auth.login 再写 session 正向修复 避免 session.flush() 清掉刚写入的 user_token / auth_credentials,减少错误重认证

3. 设计评价

合理之处:

  • sync/async 抽取共享 helper(拼参、解析响应、兼容属性),降低双份实现漂移
  • AsyncClient 按 event loop + WeakKeyDictionary 缓存,正确处理 Event loop is closed / async_to_sync / pytest-asyncio
  • UserTimezoneMiddleware 优先显式 request.user,兼顾 apigw-manager;并文档化了惰性 user 的已知限制
  • DjangoAuthUserCompatibleBackendaget()get_by_natural_key() 的差异写了 NOTE,诚实
  • 测试质量高:尤其是 async 路径断言「禁止走 sync HTTP」

建议跟进(非阻塞):

  1. CHANGES 写清 requests → httpx2、删除 get_requests_session 等破坏点;可补充选型 httpx2 的简要理由(相对较新的依赖)。
  2. APIGatewayAuthBackend 仍无 aauthenticate、且未继承 BaseBackendCookieLoginMiddlewareaauthenticate(..., auth_credentials=...) 时通常绑不到该后端,实际影响小;若有人在 ASGI 下用 JWT 参数直接走 django.contrib.auth.aauthenticate,会缺异步接口(Django 5.2 对非 BaseBackend 不会自动合成)。可确认是否需要补,或文档标明仍走 sync / middleware 直写 request.user
  3. 覆盖 configure_user 须补 async_configure_user;重写 get_by_natural_key 还须关注 async_connect_to_django_user(代码 NOTE / README 已提示,CHANGES 可再强调)。
  4. 文档可加一张 sync ↔ async API 对照表(aauthenticate vs async_* 命名混用可接受,但对照表能降低接入成本)。

4. 小结

维度 结论
新功能价值 明确:让 bkpaas-auth 可在 Django ASGI 下安全使用
存量兼容 业务配置级兼容;依赖与测试 mock 层有破坏
设计质量
测试 充分
合并建议 Approve with notes — 建议补齐 CHANGES 破坏说明即可

@piglei

piglei commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator Author

@narasux 已根据 review 让 APIGatewayAuthBackend 继承 BaseBackend。准备合并发包。

@piglei
piglei merged commit 3597c6b into TencentBlueKing:master Aug 12, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants