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

FastAPI部署至Vercel后调用Post接口/api/check-login出现500错误求助

FastAPI部署至Vercel后调用Post接口/api/check-login出现500错误求助

我完全理解你遇到的困惑——本地调试时/api/check-login接口一切正常,但部署到Vercel后就抛出500错误,而另一个简单的/api/token接口却能正常工作,这种“本地好端端,上线就崩”的问题确实很头疼。结合你的代码和场景,我来帮你分析可能的原因和对应的解决办法:

核心问题定位

首先可以确定,问题肯定出在/api/check-login里调用Udemy API的逻辑中——毕竟两个接口的差异就在于前者多了requests调用外部API的步骤。以下是最可能的几个原因:

1. Vercel Serverless Function的网络限制或超时

Vercel的无服务器函数对出站请求有默认的超时限制(通常是10秒左右),而且部分外部API可能对Vercel的服务器IP有访问限制。本地环境的网络通常更宽松,所以不会触发这类问题,但上线后就会因为超时或被拦截导致请求失败,进而抛出未处理的异常,最终返回500错误。

解决办法:

  • 给requests请求添加明确的超时时间,避免无限制等待:
req = s.get(url_checklogin, headers=headers, timeout=10)  # 设置10秒超时
  • 立即查看Vercel控制台的函数执行日志(路径:Functions -> 对应函数 -> Logs),这里会显示具体的异常栈信息,是定位500错误的关键!

2. Udemy API的反爬/身份验证拦截

Udemy的API可能会对请求的来源进行验证,比如:

  • 识别到请求来自Vercel的服务器IP,判定为非合法用户而返回403/401错误;
  • 你的请求头部不够完整,被识别为自动化工具而非真实浏览器请求;
  • 你的access_token在生产环境中无效(比如本地用的是有效token,上线后测试用的"test"token本身就不对)。

而你的代码目前没有处理这类HTTP错误,直接调用req.json(),如果Udemy返回的是错误页面而非合法JSON,就会抛出解析异常,导致FastAPI返回500。

解决办法:

  • 完善错误捕获逻辑,把具体错误信息返回给前端,方便调试:
@app.post("/api/check-login")
async def check_login(input_token: LoginItem):
    s = requests.Session()
    data = jsonable_encoder(input_token)
    url_checklogin = "https://www.udemy.com/api-2.0/contexts/me/?header=True"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
        'Authorization': 'Bearer ' + data['access_token'],
        "Accept": "application/json, text/plain, */*",
        "Accept-Language": "en-US,en;q=0.9",
        "Referer": "https://www.udemy.com/"
    }
    try:
        req = s.get(url_checklogin, headers=headers, timeout=10)
        req.raise_for_status()  # 触发HTTP错误(比如401、403)
        return req.json()
    except requests.exceptions.RequestException as e:
        # 返回错误详情,方便排查
        return {
            "error": str(e),
            "status_code": req.status_code if 'req' in locals() else None,
            "response_text": req.text if 'req' in locals() else ""
        }
  • 优化请求头部,添加更多浏览器常用的字段(比如上面代码里的Accept、Accept-Language、Referer),让请求更接近真实浏览器的行为;
  • 确保测试用的access_token是有效的,而不是硬编码的"test"。

3. 依赖安装不完整

虽然/api/token正常工作,但还是要确认Vercel部署时是否正确安装了requests依赖。如果你的requirements.txt里漏掉了requests,函数执行时会抛出ImportError,导致500错误。

解决办法:
检查项目根目录的requirements.txt,确保包含所有必要依赖:

fastapi
uvicorn
requests
beautifulsoup4
pydantic

总结

优先去查看Vercel的函数日志,找到具体的错误信息——这是最直接有效的排查方式。根据日志里的异常提示,再对应上面的方案去调整,应该就能解决问题了。

备注:内容来源于stack exchange,提问作者Blog Khóa Học

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 11:23:09