迅速搭建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的设置非常简单,让我感到惊讶。