迅速搭建FASTAPI

经过

在个人的Web服务器上尝试部署用Python编写的AI功能时遇到了500错误。经过一番调查,发现原因是服务器配置不足。尽管尝试了简化功能以减轻负载,但并未成功。因此,我决定放弃将其部署到Web服务器上,转而尝试使用FASTAPI来创建API。

FASTAPI是什么?

 

ChatGPT 先生的致意

请选择中文语言才能提供帮助。

FastAPI的主要特点如下:

高性能:通过Starlette(ASGI服务器)提供的异步处理支持,可以创建高性能的API。在Python框架中具有最快的性能水平。

快速开发:FastAPI利用Python3.6及以上版本的类型提示,提供参数和请求体的自动验证、数据序列化和转换。这可以提高开发速度并减少错误数量。

易于使用:FastAPI专为构建和测试API而设计。还可以自动使用OpenAPI(以前称为Swagger)和JSON Schema标准来生成交互式的API文档。

可靠:FastAPI通过类型提示和自动验证确保代码按预期运行。这可以将API在生产环境中失败的可能性降至最低。

现代化:FastAPI充分利用了Python的异步处理和协程支持。这使得连接到异步数据库和执行异步I/O操作变得容易。

简洁直观:FastAPI采用了Pythonic的方法,重视代码的清晰和易于理解。

由于这些特点,FastAPI已成为现代Web应用开发中的重要选择。

似乎可以轻松快速地构建API。

建造步骤

请安装 FASTAPI 和 Uvicorn。

pip install fastapi
pip install uvicorn

创建FASTAPI代码main.py。
这次我们假设它是一个聊天机器人的功能,它接收文本并返回转换后的文本。所以我写了ChatGPT。

#Fast API
from fastapi import FastAPI
from pydantic import BaseModel
 省略
app = FastAPI()
 省略
    
class Message(BaseModel):
    message: str
    
@app.post("/chatbot")
async def chatbot(message: Message):
    user_message = message.message
    response = 省略(str(user_message))
    return {
        "messages": [
            {"sender": "user", "text":user_message}, 
            {"sender": "bot", "text": response}
            ]
            }

使用pydantic进行类型指定似乎是个不错的选择。

我会在本地启动uvicorn来进行确认。

uvicorn main:app --reload

您可以通过访问 http://127.0.0.1:8000/docs 来进行操作确认。

一旦确认操作完成后,将进行与外部的连接设置。

由于安全风险增加,从这里开始自负责任。

确定要将服务器作为的端口号启动。
默认端口号是8000。

我们会在Web服务器端的目标代码中进行API的配置。

http://グローバルアドレス:8000 

请自行更改外部IP地址。
在路由器上进行转发设置。
设置服务器的本地地址和端口号。

形象

      ①          ②
web → ルータ → サーバ

①グローバルアドレス:8000

②ローカルルアドレス:8000

我会启动uvicorn以接受来自本地以外的请求。

uvicorn main:app --host 0.0.0.0 --port 8000

我在Windows PC上进行了测试并执行了到此为止的操作,但由于我想要保持它一直开机运行,所以决定使用Jetson来实现。我在其中使用了Nginx作为代理。

代理服务器

将代理设置为8000,FASTAPI设置为8001。
安装Nginx。

sudo apt install nginx

创建一个Nginx配置文件。

sudo nano /etc/nginx/sites-available/my-fastapi

Nginx配置内容

    server {
        listen 8000;
        server_name your_domain_or_IP;
    
        location / {
            proxy_pass http://localhost:8001;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

创建符号链接。

sudo ln -s /etc/nginx/sites-available/my-fastapi /etc/nginx/sites-enabled/

重新启动Nginx。

sudo systemctl restart nginx

使用uvicorn来启动与Nginx通信所需的内容。

uvicorn main:app --host 0.0.0.0 --port 8001

完了了。

堵塞的地方

需要在路由器上进行转发设置。虽然这次的操作与此无关,但是我家的Buffalo路由器与Chrome不兼容,导致设置无法正常生效,耗费了很多时间。后来我在Windows PC上切换到Edge浏览器就顺利完成了。
补充说明→并非是浏览器兼容性问题,而是浏览器缓存的问题。

对此的想法和未来计划

由于全球IP地址发生变化,会手动操作或通过DDNS进行处理。由于担心开放端口,即使多花一些钱,也希望能在某个时候将其迁移到云上。
这次的功能并不复杂,但是我对FASTAPI的设置非常简单,让我感到惊讶。

广告
将在 10 秒后关闭
bannerAds