首页 > 编程问答 >如何在 vercel 部署中路由 python 和 typescript 无服务器函数

如何在 vercel 部署中路由 python 和 typescript 无服务器函数

时间:2024-07-22 11:33:29浏览次数:7  
标签:python typescript next.js networking vercel

我从一个带有 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 路由:

  1. TypeScript API 路由(用于主要 API):

  2. 将的主要 API 路由保留在 app/api 目录中,使用 TypeScript 实现。这些路由将通过 fetch('api/your-route') 从的前端轻松访问。

  3. Python/PyTorch 后端(作为单独服务):

  4. 部署选项:

    • 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 良好集成。
      • 缺点: 需要设置和管理单独的服务。
  5. 与 TypeScript API 交互:

    • 从的 TypeScript API 路由中,使用 fetch 或类似的 HTTP 客户端库对托管的 Python 后端发出请求。
    • 确保在生产中设置适当的 CORS 标头以允许来自 Vercel 前端的请求。

实施示例(使用外部服务)

假设选择在 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

相关文章

  • python中datetime模块
    datetime模块可以更方便的显示日期,并对日期进行计算。datetime模块中常用的类及其功能描述如下:datetime.datetime------>表示日期时间的类(常用)datetime.timedelta------>表示时间间隔的类(常用)datetime.date------>表示日期的类datetime.time------>表示时间的类datetime.......
  • Python - requests
    前言:介绍:安装及验证:使用:连续接口请求:传参方式: 前言:当你上班无聊的时候,你做什么,说实话有人让我写个requests的教程,教程我觉得网上已经有很多教程了,也很全面,我还是不要献丑了介绍:哎,我认为就是一个接口请求的仓库,不过requests属于第三方库,......
  • Python学习计划——2.4列表推导式(List Comprehensions)
    列表推导式是Python的一种简洁且强大的语法,用于生成新的列表。它可以用更少的代码、更清晰的方式来创建列表,特别是在处理简单的循环和条件操作时。1.基本语法列表推导式的基本语法如下:[expressionforiteminiterable]expression:表达式,计算结果用于生成列表的元素。ite......
  • Python学习计划——2.3常用内置函数(len, max, min, sum, etc.)
    Python提供了许多内置函数,用于简化对数据结构的操作。以下是一些常用的内置函数及其详细说明。1.len()len()函数用于返回对象(如列表、元组、字符串、字典等)的长度(元素个数)。示例:#列表fruits=["apple","banana","cherry"]print(len(fruits))#输出:3#元组c......
  • 哪个 Python 框架可以在 Google Collab 中显示和更改图像?
    我希望能够在使用GoogleCollab时为RL绘制高fps的位图。我现在可以使用OpenCV绘制图像cv2_imshowgoogle替换cv2.imshow但是,它无法替换现有图像,它下面绘制了新的我能够在替换imshow函数中使用一些JavaScript来修复它。但刷新率约为......
  • VSCode 自动建议 python 导入而不依赖 Intellisense
    我正在使用Transformer中的AutoModel之类的对象,并且经常遇到自动导入建议无法找到的对象。我总是希望VSCode建议“从Transformer中执行”,而不是费心寻找它找不到的原因每当看到未定义的“AutoModel”时,都会导入AutoModel”,因此无需扫描任何python导入目录。这......
  • 如何使用Python计算位移自相关函数?
    我正在使用python来分析粒子的异常扩散。我已经得到了粒子轨迹的位移,我想计算并绘制位移自相关与滞后时间t的关系。我认为可能存在使用t和位移(如deltar)的自相关函数的一般函数,但我不能没找到。我可以得到函数或代码吗?可以使用numpy和matplotlib库在Python......
  • 一天一点点,第四天Python基础
    第一天:一天一点点。Python基础-CSDN博客第二天:一天一点点,接上章Python基础-CSDN博客第三天:一天一点点,第三天Python基础(循环语句)-CSDN博客推导式推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。推导式是一种强大且简洁的语法,适用于生......
  • Python - for循环不使用正则表达式附加数组
    以下代码从URL获取版本号,然后对于每个版本号,转到该版本号的页面并使用文件名的特定模式填充数组。生成的数组应包含每个版本号的文件名列表,但它似乎只包含早期版本(2.6)。使用print语句,我可以看到代码的工作原理是它获取sha256sums.asc文件-所有这些文件,所有版本。我猜......
  • 使用 callable_iterator (re.finditer) 导致 Python 冻结
    我有一个为文本的每一行调用的函数。deftokenize_line(line:str,cmd=''):matches=re.finditer(Patterns.SUPPORTED_TOKENS,line)tokens_found,not_found,start_idx=[],[],0print(matches)formatchinmatches:pass#Rest......