修复:服务详情接口浏览量自增异步任务导致SQLAlchemy会话状态冲突
- 根本原因:使用asyncio.create_task在后台执行db.commit(),主请求结束时调用db.close()导致会话状态冲突 - 错误:Method 'close()' can't be called here; method 'commit()' is already in progress - 修复:改为同步执行浏览量自增和浏览历史记录,避免异步任务与会话生命周期冲突
This commit is contained in:
@@ -192,32 +192,29 @@ async def service_detail(
|
||||
item["gallery"] = _parse_json(item.get("gallery_json"), [])
|
||||
item["skus"] = _parse_json(item.get("skus_json"), [])
|
||||
|
||||
# 浏览量自增(异步,不阻塞响应)
|
||||
import asyncio
|
||||
async def _incr_view():
|
||||
try:
|
||||
await db.session.execute(
|
||||
text("UPDATE opc_services SET view_count = view_count + 1 WHERE id = :id"),
|
||||
{"id": service_id},
|
||||
)
|
||||
await db.session.commit()
|
||||
# 记录浏览历史
|
||||
await db.session.execute(
|
||||
text("""INSERT INTO service_views (id, service_id, user_id, ip, user_agent, created_at)
|
||||
VALUES (:id, :service_id, :user_id, :ip, :ua, :now)"""),
|
||||
{
|
||||
"id": _gen_id("sv_"),
|
||||
"service_id": service_id,
|
||||
"user_id": user.get("id", "") if user else "",
|
||||
"ip": "",
|
||||
"ua": "",
|
||||
"now": _now(),
|
||||
},
|
||||
)
|
||||
await db.session.commit()
|
||||
except Exception:
|
||||
pass
|
||||
asyncio.create_task(_incr_view())
|
||||
# 浏览量自增(同步执行,避免异步任务导致会话状态冲突)
|
||||
try:
|
||||
await db.session.execute(
|
||||
text("UPDATE opc_services SET view_count = view_count + 1 WHERE id = :id"),
|
||||
{"id": service_id},
|
||||
)
|
||||
await db.session.commit()
|
||||
# 记录浏览历史
|
||||
await db.session.execute(
|
||||
text("""INSERT INTO service_views (id, service_id, user_id, ip, user_agent, created_at)
|
||||
VALUES (:id, :service_id, :user_id, :ip, :ua, :now)"""),
|
||||
{
|
||||
"id": _gen_id("sv_"),
|
||||
"service_id": service_id,
|
||||
"user_id": user.get("id", "") if user else "",
|
||||
"ip": "",
|
||||
"ua": "",
|
||||
"now": _now(),
|
||||
},
|
||||
)
|
||||
await db.session.commit()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# 评价统计
|
||||
review_sql = """
|
||||
|
||||
Reference in New Issue
Block a user