如何在aiohttp基于类的视图中实现带pk的详情GET接口?
用aiohttp类视图实现GET /view/{pk}详情接口
嘿,这事儿其实没那么复杂,我给你两种实用方案,你按需选就行:
方案一:拆分独立视图(强烈推荐)
把列表查询、资源创建的逻辑,和详情查询的逻辑分开,用两个独立的类视图来处理,这样代码职责清晰,后期维护起来特别省心。
直接上完整代码:
from aiohttp import web # 处理列表查询(GET /view)和资源创建(POST /view)的视图 class MyView(web.View): async def get(self): resp = await get_response(self.request) return resp async def post(self): resp = await post_response(self.request) return resp # 专门处理详情查询(GET /view/{pk})的视图 class MyDetailView(web.View): async def get(self): # 这一步是关键:从路由匹配信息里取出pk参数 pk = self.request.match_info.get('pk') # 调用你的详情业务逻辑,把pk传进去就行 resp = await get_detail_response(self.request, pk) return resp # 注册路由 app.router.add_view('/view', MyView) # 这里的{pk}是路由参数,要是想只允许数字类型的主键,可以写成{pk:\d+} app.router.add_view('/view/{pk}', MyDetailView)
方案二:同一视图兼容两种逻辑(适合简单场景)
如果你的业务逻辑特别简单,不想多写一个类,也可以把两种逻辑塞进同一个视图里,通过判断是否存在pk参数来分支处理:
from aiohttp import web class MyView(web.View): async def get(self): # 尝试从路由里获取pk参数 pk = self.request.match_info.get('pk') if pk: # 存在pk,走详情查询逻辑 resp = await get_detail_response(self.request, pk) else: # 没有pk,走列表查询逻辑 resp = await get_response(self.request) return resp async def post(self): resp = await post_response(self.request) return resp # 把两个路由都绑定到这个视图类上 app.router.add_view('/view', MyView) app.router.add_view('/view/{pk}', MyView)
几个要注意的小细节:
- 路由参数用
{参数名}定义,要是想限制参数类型(比如只允许数字主键),可以加正则约束,比如{pk:\d+},这样非法的参数会直接返回404 - 在类视图的方法里,通过
self.request.match_info.get('参数名')就能轻松拿到路由里的具体参数值 - 还是那句话,优先选方案一,拆分视图能让代码逻辑更清晰,后续扩展功能或者排查问题都会轻松很多
内容的提问来源于stack exchange,提问作者Oleksandr Dashkov
相关产品推荐
相关产品推荐

