使用 FastAPI 搭建基于 Python 的 WEB API 接口

1. GET 方法

1.1. 新建一个名为 Test.py 的FastAPI app

#!/usr/bin/env python3

from fastapi import FastAPI
app = FastAPI()

@app.get('/')

def main(parameter:str=None):
    return parameter

1.2. 新建一个 uvirun.py,其中有三个参数:分别用于接收 FastAPI app 名,接口 Host 地址 以及 端口号

#!/usr/bin/env python3
import uvicorn
import sys

appName = sys.argv[1] # 接收app文件名
Host = sys.argv[2]
Port = int(sys.argv[3])

uvicorn.run(appName+":app", host=Host, port=Port, log_level='info', access_log=False)

1.3. 运行 python3 ./uvirun.py Test 127.0.0.1 12345 启动 API

1.4. 访问 ‘http://127.0.0.1:12345/?parameter=Hello World!’, 显示‘Hello World!’, 则证明API创建成功。

previe

2. POST 方法

2.1. 新建一个 Test-post.py

from pydantic import BaseModel
from fastapi import FastAPI

class Student(BaseModel):
    Name: str = None
    School: str = None
    Mark: list = None
    
app = FastAPI()

@app.post("/student") #自定义 POST 接收地址
async def push(item: Student):
    if item.Mark: avgMark = sum(map(int, item.Mark)) / len(item.Mark)
    return "%s is a student from %s with the average score of %s"%(item.Name, item.School, avgMark)

2.2. 新建一个 uvirun.py (和之前Get方法使用的文件一致)

#!/usr/bin/env python3
import uvicorn
import sys

appName = sys.argv[1] # 接收app文件名
Host = sys.argv[2]
Port = int(sys.argv[3])

uvicorn.run(appName+":app", host=Host, port=Port, log_level='info', access_log=False)

2.3. 运行 python3 ./uvirun.py Test-post 127.0.0.1 12345 启动 API

2.4. 对接口进行 POST 请求,返回处理完成的结果

curl -H "Content-Type:application/json" -X POST \
--data '{
    "Name": "Wenbo Li", 
    "School": "University of Sheffield", 
    "Mark": [78,74,72,72,70,69,66,66,65,65]
    }' \
http://127.0.0.1:12345/student

previe

3. 后台运行 API

在命令前加上 nohup,在最后加上 &

For example:

nohup python3 ./uvirun.py Test-post 127.0.0.1 12345 &

4. 开机启动 (Ubuntu)

在 18.04 之后版本的 Ubuntu 已不再默认使用 rc.loacl 添加启动项,
而是统一使用 systemctl 来协调启动服务。

4.1. 新建一个api启动项的服务文件 /etc/systemd/system/YOUR_SERVICE_NAME.service

4.2. 编辑文件:修改 Description & 输入启动命令 ExecStart

[Unit]
Description=YOUR SERVICE DESC

[Service]
ExecStart=/usr/bin/python3 /YOUR_FULL_PATH/uvirun.py Test-post 127.0.0.1 12345
ExecReload=
ExecStop=
StandardOutput=tty

[Install]
WantedBy=multi-user.target

4.3. 加载并启动新加入的服务

sudo systemctl daemon-reload
sudo systemctl enable YOUR_SERVICE_NAME.service
sudo systemctl start YOUR_SERVICE_NAME.service

4.4. 检查启动状态

sudo systemctl status YOUR_SERVICE_NAME.service

正常情况下会显示 Active: active (running).

4.5. 重启系统后再次检查状态,若无误则启动项设置完成。