原创 菜鸟童靴 菜鸟童靴 4天前
fastapi介绍
FastAPI 文档 https://fastapi.tiangolo.com/
FastApi 是一个异步 Web 框架,它的速度非常非常非常快。远远超过 Flask。速度可以匹敌 Golang 写的接口
有官方的docker 镜像,方便用docker部署
安装:
1、安装 FastAPI 模块pip install fastapi2、安装 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 osfrom fastapi import FastAPIfrom starlette.responses import FileResponseapp = 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 responseif __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 FastAPIapp = 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 osfrom fastapi import FastAPIapp = 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/docshttp://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)
测试结果:

文章首发于微信公众号菜鸟童靴,不定期更新,如有需要后台加微信


1080

被折叠的 条评论
为什么被折叠?



