FastAPI 学习之两种应用场景

 

原创 菜鸟童靴 菜鸟童靴 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 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 osfrom 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/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)

 

测试结果:

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章