我从一个带有 Next.js 和 Typescript 前端以及 python 后端的全栈应用程序开始。由于我们想在 vercel 上部署,因此我们将所有后端功能迁移到 /api 文件夹中的 typescript 函数中,可通过以下方式访问:
fetch('api/**foldername**)
问题是我有一个简单的 pytorch 模型,因此它需要是 python。我在网上读到,您也可以拥有 python 无服务器 vercel 函数。
我需要有关如何使两种无服务器函数类型协同工作的建议。
这是我的文件夹结构:app/api/ 路由名称 /route.ts 我对route.py 进行了同样的尝试,但没有成功。我也尝试将 upload.py 放在 api 文件夹中,但这也不起作用。
这是我的 upload.py 文件:
from http.server import BaseHTTPRequestHandler
class handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write("Hello, worldfbgdfgbdfgbd!".encode("utf-8"))
return
非常简单,只是为了测试连接性。
我尝试使用 fetch单击前端上的按钮时,控制台会记录响应,然后转到 localhost:3000/api/update。
在线文档不多,在查看了一些示例 github 存储库后,我不确定为什么我的情况没有不起作用。
非常感谢任何建议。
当然,我可以帮助在 Vercel 上部署 Python 和 TypeScript 无服务器函数。
了解 Vercel 的无服务器函数
Vercel 主要针对 JavaScript/TypeScript 环境进行了优化。虽然它确实支持 Python 等其他语言,但这涉及使用自定义运行时,这在设置和部署方面可能更具挑战性。
将 Python 和 TypeScript 无服务器函数与 Vercel 结合使用的策略
鉴于的目标,以下策略概述了如何在 Vercel 上有效管理 Python (PyTorch) 模型和 TypeScript API 路由:
-
TypeScript API 路由(用于主要 API):
-
将的主要 API 路由保留在
app/api
目录中,使用 TypeScript 实现。这些路由将通过fetch('api/your-route')
从的前端轻松访问。 -
Python/PyTorch 后端(作为单独服务):
-
部署选项:
-
Vercel 无服务器函数(使用自定义运行时):
- 虽然 Vercel 主要支持 Node.js,但可以使用自定义运行时(如 Python)。
- 优点: 保持所有内容都在 Vercel 生态系统中。
- 缺点: 需要更多配置、潜在的冷启动以及对 Python 环境的控制受限。如果计划将 PyTorch 模型扩展为更重要的功能,则这可能不是最佳选择。
-
外部服务(推荐):
- 云函数(例如 AWS Lambda、Google Cloud Functions、Azure Functions): 非常适合运行无服务器 Python 代码。
- 容器化部署(例如 Google Cloud Run、AWS App Runner、Azure 容器实例): 如果需要对环境进行更多控制或有更复杂的依赖项,则此方法效果很好。
- 优点: 专门针对 Python 进行了优化、可扩展且与 PyTorch 良好集成。
- 缺点: 需要设置和管理单独的服务。
-
Vercel 无服务器函数(使用自定义运行时):
-
与 TypeScript API 交互:
-
从的 TypeScript API 路由中,使用
fetch
或类似的 HTTP 客户端库对托管的 Python 后端发出请求。 - 确保在生产中设置适当的 CORS 标头以允许来自 Vercel 前端的请求。
-
从的 TypeScript API 路由中,使用
实施示例(使用外部服务)
假设选择在 AWS Lambda 上部署 PyTorch 模型:
- 1. 创建 AWS Lambda 函数:
- 使用所需的 PyTorch 依赖项设置 Lambda 函数。
-
将的 PyTorch 模型加载并处理逻辑放入 Lambda 函数处理程序中。
-
2. 公开 Lambda 函数:
-
为的 Lambda 函数创建一个 API 网关端点,使其可通过 HTTP 访问。
-
3. 更新 TypeScript API 路由: ```typescript // app/api/your-route.ts
import { NextApiRequest, NextApiResponse } from 'next';
export default async (req: NextApiRequest, res: NextApiResponse) => { if (req.method === 'POST') { try { const response = await fetch('https://your-api-gateway-endpoint.amazonaws.com/your-lambda-function', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(req.body), // 将数据发送到 Lambda 函数 });
const data = await response.json();
res.status(200).json(data);
} catch (error) {
console.error(error);
res.status(500).json({ error: 'An error occurred' });
}
} else {
res.status(405).end(); // 方法不允许
}
}; ```
重要提示
- API 密钥/身份验证: 为确保安全性,请实施 API 密钥或身份验证机制,以保护的 Python 后端免遭未经授权的访问。
- 错误处理: 在的 TypeScript 和 Python 代码中包含强大的错误处理,以优雅地管理故障。
- 测试: 在部署之前彻底测试 TypeScript 和 Python 函数之间的集成。
这种方法允许利用 Vercel 对 TypeScript API 路由的优势,同时为的 PyTorch 模型提供专门的 Python 环境。通过将的 Python 后端托管为一个单独的服务,将获得更大的灵活性、可扩展性和与 PyTorch 生态系统的更轻松集成。
标签:python,typescript,next.js,networking,vercel From: 78776858