原创 菜鸟童靴 菜鸟童靴 4天前
fastapi介绍
FastAPI 文档 https://fastapi.tiangolo.com/
FastApi 是一个异步 Web 框架,它的速度非常非常非常快。远远超过 Flask。速度可以匹敌 Golang 写的接口
有官方的docker 镜像,方便用docker部署
安装:
1、安装 FastAPI 模块
pip install fastapi
2、安装 Uvicorn 模块(生产环境使用的ASGI服务器)
Uvicorn是基于uvloop和httptools构建的闪电般快速的ASGI服务器
pip install uvicorn
今天在这里简单介绍,我们可以使用fastapi 在做些什么?
应用场景一
需求:
实现一个本地的文件分享服务,
(1)服务要求,多人使用不冲突
(2)网络服务要稳定
(3)使用者,只知道自己要下载的文件,其他一概不知,具有安全性
fastapi 基于starlette 开发。而 starlette里面有一个返回类型叫做FileResponse
。使用它,可以非常方便地返回文件。
这里借助一个库
pip install aiofiles
我们来看看代码。
首先建立一个test.py文件,并分享当前目录下的文件内容a.mp4
import os
from fastapi import FastAPI
from starlette.responses import FileResponse
app = FastAPI()
@app.get('/download/{filename}')
def get_record(filename: str):
path = os.path.join(os.getcwd(), filename)
print(path)
if not os.path.exists(path):
return {'success': False, 'msg': '文件不存在!'}
response = FileResponse(path)
return response
if __name__ == '__main__':
command = "uvicorn test:app --host 0.0.0.0 --port 8888"
os.system(command)
运行程序,开启服务
分享文件夹下的文件有:
请求服务,开启下载我们想要的文件:
或者:
总结:
这样,你想分享具体哪个文件,你就构造一个 URL:http://ip:8888/download/文件名
发给别人。别人直接访问这个 URL 就能来下载对应的文件了。只要对方不知道其他文件的文件名,就无法看到或者下载其他文件。
如果想更安全,你还可以给每个文件做一个单独的文件编号,把编号-地址对应关系存放在数据库中。用户请求的时候,传入的是文件编号,你从数据库查出文件的真实路径再通过FileResponse
返回。
总结参考来源于,网易青南大佬的文章,在此做一个学习记录
应用场景二
接口的实现:
(1)创建 main.py 文件
import os
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
(2)启动ASGI Server
uvicorn main:app --reload
该命令uvicorn main:app指的是:
main:文件main.py(Python“模块”)。
app:main.py在线内创建的对象app = FastAPI()。
--reload:更改代码后使服务器重新启动。这样做是为了开发
(3)完整代码
import os
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
if __name__ == '__main__':
command = "uvicorn test:app --host 0.0.0.0 --port 8888 --reload"
os.system(command)
(4)接口请求
(5)查看接口文档,有两种接口文档
http://localhost:8888/docs
http://localhost:8888/redoc
(6)
再看如下的代码分析:
import os
from fastapi import FastAPI
app = FastAPI()
@app.get('/query/{uid}')
def query(uid: int):
msg = f'你查询的 uid 为:{uid}'
return {'success': True, 'msg': msg}
if __name__ == '__main__':
command = "uvicorn test:app --host 0.0.0.0 --port 8888 --reload"
os.system(command)
在页面请求后:
当我们传递字符串时:
当 query 后面的参数不是整数时,正常报错了。
更改需求
有一个非常简单的需求:编写一个 HTTP 接口,使用 POST 方式发送一个 JSON 字符串,接口里面读取发送上来的参数,对其中某个参数进行处理,并返回。我们需要手动验证用户 POST 提交上来的数据是什么格式的,字段对不对。
但使用 FastApi 的时候,我们只需要类型标注就能解决所有问题。首先我们导入from pydantic import BaseModel
,然后继承BaseModel
实现我们允许 POST 方法提交上来的数据字段和格式:
import os
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class People(BaseModel):
name: str
age: int
address: str
salary: float
@app.post('/insert')
def insert(people: People):
age_after_10_years = people.age + 10
msg = f'此人名字叫做:{people.name},十年后此人年龄:{age_after_10_years}'
return {'success': True, 'msg': msg}
if __name__ == '__main__':
command = "uvicorn test:app --host 0.0.0.0 --port 8888 --reload"
os.system(command)
insert
函数的参数people
通过类型标注指定为People
类型。
当我们使用 POST 方式提交数据时,FastApi 自动会以People
中定义的字段为基准来校验数据,发现不对就返回报错信息。
验证代码:
import requests
people = {"name": "MrYang", "age": 26, "address": "bejing", "salary": 1111}
url = "http://localhost:8888/insert"
result = requests.post(url, headers={}, json=people).json()
print(result)
测试结果:
文章首发于微信公众号菜鸟童靴,不定期更新,如有需要后台加微信