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

