You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一Python应用内的API端点是否支持调用同服务下的其他端点?

问题解答

结论

可以实现,但你当前的代码存在多处问题,绝大多数场景下无法正常运行,且这种实现方式非常不推荐。

现有代码的核心问题

  • 阻塞导致死锁:你使用的requests是同步HTTP客户端,而你的视图函数是async异步类型。同步请求会完全阻塞当前服务的事件循环,同服务的/api/users接口根本得不到调度处理,最终会陷入无限等待直到请求超时。
  • 拼写错误:代码中变量定义为response,返回时错误写为respone,运行时会直接抛出NameError。
  • 不必要的HTTP开销:同服务内部的逻辑调用完全不需要走HTTP请求绕一圈,额外增加网络开销、序列化反序列化开销,还会提升故障概率。

修复方案

方案1:改为异步HTTP请求(不推荐,仅满足你要发HTTP请求的需求)

将同步的requests替换为异步HTTP客户端如aiohttp,示例修改如下:

import aiohttp

@routes.get("/api/accounts")
async def accounts(request):    
    api_url = "http://127.0.0.1:3978/api/users"    
    async with aiohttp.ClientSession() as session:
        async with session.get(api_url) as resp:
            data = await resp.json()
    return json_response(data=data)

@routes.get("/api/users")
async def users(request):
    # 你的原有逻辑
    pass

注意:该方案仍需要你确保服务的并发处理能力足够(如ASGI服务器配置了足够的worker、事件循环空闲),否则仍可能出现请求超时。

方案2:封装公共逻辑(强烈推荐)

将两个接口共用的逻辑抽离为独立的公共函数,直接内部调用即可,完全不需要走HTTP:

# 抽离公共逻辑
async def get_users_info():
    # 原本写在/users接口里的业务逻辑放这里
    return {"user_list": []}

@routes.get("/api/accounts")
async def accounts(request):    
    user_data = await get_users_info()
    # 你自己的业务处理逻辑
    return json_response(data=user_data)

@routes.get("/api/users")
async def users(request):
    user_data = await get_users_info()
    return json_response(data=user_data)

内容的提问来源于stack exchange,提问作者user16528894

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:36:03