
第一节:fastapi入门
一、fastapi框架介绍
fastapi是一个现代、快速的python web框架,用于构建api。它基于python 3.6+的类型提示特性,使得代码更加简洁且易于绶护。
关键特性:
快速:可与 nodejs 和 go 并肩的极高性能(归功于 starlette 和 pydantic)。最快的 python web 框架之一。
高效编码:提高功能开发速度约 200% 至 300%。
更少 bug:减少约 40% 的人为(开发者)导致错误。
智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
简单:设计的易于使用和学习,阅读文档的时间更短。
简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
健壮:生产可用级别的代码。还有自动生成的交互式文档。
标准化:基于(并完全兼容)api 的相关开放标准:openapi (以前被称为 swagger) 和 json schema。
fastapi 站在巨人的肩膀上:
- starlette 用于构建 web 部件:starlette 是一个轻量级的 asgi 框架和工具包,特别适合用来构建高性能的 asyncio 服务.
- pydantic 用于数据的操作:python 中用于数据接口定义检查与设置管理的库。
什么是asgi服务(wsgi)
wsgi,(web server gateway interface),web服务器网关接口,是一种web服务器网关接口,它是一个web服务器(如nginx,uwsgi等服务器)与web应用(如flask框架写的程序)通信的一种规范。当前运行在wsgi协议之上的web框架有bottle,flask,django。
asgi:异步网关协议接口( asynchronous server gateway interface ) ,一个介于网络协议服务和python应用之间的标准接口,能够处理多种通用的协议类型,包括http,http2和websocket。
wsgi和asgi的区别
wsgi是基于http协议模式的,不支持websocket,而asgi的诞生则是为了解决python常用的wsgi不支持当前web开发中的一些新的协议标准。同时,asgi对于wsgi原有的模式的支持和websocket的扩展,即asgi是wsgi的扩展。
1、补充web开发
web应用开发主要是建立在b/s架构模式下,衍生出来的一系列web应用程序,即主要是基于浏览器的应用程序开发,这也是web应用程序开发的基础,比如淘宝、京东、当当网等。web开发在近年来,随着本身技术的突破以及移动设备的普及,基于web领域的开发,也出现了明确的岗位职责分工,一个web互联网产品中,基本上会分为web ui设计、web前端开发以及web后端开发。
1)web前端开发
web前端开发用到的编程语言主要有javascript,以及伴随有标记性文本语言html和样式渲染方式css。以及近年来衍生出来的一批优秀web前端框架,使web前端在应用构建方面的效率得到显著提升。另外nodejs的出现,越来越多的web前端开发人员开始走入服务端编程领域,甚至在一些项目中扮演着web全栈开发的角色。
2)web后端开发
web后端开发,主要用到的语言有python、php、java等,当然随着nodejs的兴起,也成为近年来服务端开发的另一种选择。
web应用程序开发是基于浏览器的,浏览器本身已经解决了多平台性兼容的问题,所以web开发一般是无需考虑跨平台所面临的兼容性问题。但是,web开发领域需要解决的有另一类问题,那便是多端兼容以及融合的问题,虽然web是基于浏览器的,没有跨平台的问题,但多端的快速发展,是web开发领域的新问题,即pc端、移动端以及当下比较火热的各类小程序端。
二、fastapi安装
1、安装python虚拟环境
为什么要使用虚拟环境
- 项目部署时,直接导出项目对应的环境中的库就可以了;
- 同时开发多个项目,各自项目使用的python版本不同,譬如一个是python2,另一个是python3,那么需要来回的切换python版本;
- 当你同时开发多个项目时,特别是多个项目使用同一个库,譬如:django,但是各自项目使用的django的版本不一致时,那么你在开发这些项目时,需要来回的卸载和安装不同的版本,因为同一个python环境中,同名的库只能有一个版本。
虚拟环境的安装步骤
安装好python环境
安装虚拟环境库,在cmd中输入:
pip install virtualenv
创建虚拟环境,在cmd中切换到需要创建虚拟环境的目录下,执行:
virtualenv env_name
激活虚拟环境,在cmd中进入到 第三步创建的 env_name/scripts 目录下,执行:
activate
执行成功后,在cmd中,当前输入行前面会有 (env_name) 的前缀
在当前状态下,使用 pip 就是在虚拟环境中安装第三方库了
退出虚拟环境,cmd中输入:
deactivate
2、安装fastapi
需要安装所有的可选依赖及对应功能,包括了 uvicorn,你可以将其用作运行代码的服务器。
pip install fastapi[all] -i https://pypi.douban.com/simple/
你也可以分开来安装。
假如你想将应用程序部署到生产环境,你可能要执行以下操作:
pip install fastapi
并且安装 uvicorn来作为服务器:
pip install "uvicorn[standard]"
三、第一个fastapi案例
创建一个main.py
from fastapi import fastapi
app = fastapi()
@app.get("/")
def root():
return 'hello'
@app.get("/hello/{name}")
def say_hello(name: str):
return {"message": f"hello {name}"}
# 可以不要
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000)1、访问接口和文档
2、接口文档半天打不开的解决
这个接口文档调用了一个 js脚本,这个脚本是部署在国外的,总之 就是因为这个原因导致我们没法访问了,由此我们需要把这个脚本从网上下载下来,放到本地,把此处调用国外的脚本变成调用我们自己本地的,即可。
1)下载这些国外服务器的资源到一个static目录中
2)复制到项目中
3)修改fastapi的源代码
4) 在app中注册static目录
5)打开接口文档
3、总结
1)uvicorn命令说明:
uvicorn main:app 命令含义如下:
main:main.py文件(一个 python「模块」)。app:在main.py文件中通过app = fastapi()创建的对象。--reload:让服务器在更新代码后重新启动。仅在开发时使用该选项。
2)app变量
这里的变量 app 会是 fastapi 类的一个实例 变量名字。这个实例将是创建你所有 api 的主要交互对象。
也可以修改app变量名字:
from fastapi import fastapi
my_awesome_api = fastapi()
@my_awesome_api.get("/")
def root():
return {"message": "hello world"}3)请求路径(路由)
请求路径指的是 url 中从第一个 / 起的后半部分。所以,在一个这样的 url 中:
http://example.com/items/foo
http://127.0.0.1/items/foo
那么,真正的请求路径(路由)是:/items/foo
在fastapi中,路由的配置是通过: 装饰器 完成的。
4)请求方法(操作)
在 http 协议中,你可以使用以下的其中一种(或多种)请求方法 与每个路径进行通信。
通常使用:
post:创建数据。get:读取数据。put:更新数据。delete:删除数据。- patch: 修改单一数据
配置请求方法:
@app.post()@app.put()@app.delete()- @app.get()
以及更少见的:
@app.options()@app.head()@app.patch()@app.trace()
5)路由+请求方法 +函数的映射
- 路径 :是
/ - 操作 :是
get - 函数 :是位于「装饰器」下方的函数(位于
@app.get("/")下方)
@app.get("/")
def root():
return {"message": "hello world"}6)返回响应
from fastapi import fastapi
app = fastapi()
@app.get("/")
def root():
return {"message": "hello world"} # 返回响应你还可以返回一个 dict、list,像 str、int 一样的单个值,等等。你还可以返回 pydantic 模型。还有许多其他将会自动转换为 json 的对象和模型(包括 orm 对象等)。
四、路由参数
你可以使用与 python 格式化字符串相同的语法来声明路径"参数"或"变量":
@app.get("/items/{item_id}")
def read_item(item_id):
return {"item_id": item_id}路径参数 item_id 的值将作为参数 item_id 传递给你的函数。所以,如果你运行示例并访问 http://127.0.0.1:8000/items/foo,将会看到如下响应:
{"item_id":"foo"}1、定义参数的类型
你可以使用标准的 python 类型标注为函数中的路径参数声明类型。
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}在这个例子中,item_id 被声明为 int 类型。fastapi 通过上面的类型声明提供了对请求的自动"解析"。
同时还提供数据校验功能:
如果你通过浏览器访问 http://127.0.0.1:8000/items/foo,你会看到一个清晰可读的 http 错误:
{
"detail": [
{
"loc": [
"path",
"item_id"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
}因为路径参数 item_id 传入的值为 "foo",它不是一个 int。
你可以使用同样的类型声明来声明 str、float、bool 以及许多其他的复合数据类型。
2、路由匹配的顺序
由于路由匹配操作是按顺序依次运行的,你需要确保路径 /users/me 声明在路径 /users/{user_id}之前:
@app.get("/users/me")
def read_user_me():
return {"user_id": "the current user"}
@app.get("/users/{user_id}")
def read_user(user_id: str):
return {"user_id": user_id}否则,/users/{user_id} 的路径还将与 /users/me 相匹配,"认为"自己正在接收一个值为 "me" 的 user_id 参数。
3、预设值参数
如果你有一个接收路径参数的路径操作,但你希望预先设定可能的有效参数值,则可以使用标准的 python enum 类型。
python中的枚举数据类型:是指列出有穷集合中的所有元素,即一一列举的意思。在python中,枚举可以视为是一种数据类型,当一个变量的取值只有几种有限的情况时,我们可以将其声明为枚举类型。例如表示周几的这一变量weekday,只有七种可能的取值,我们就可以将其声明为枚举类型。
from enum import enum
class weekday(enum):
monday = 1
tuesday = 2
wednesday = 3
thirsday = 4
friday = 5
saturday = 6
sunday = 7
print(weekday.wednesday) # weekday.wednesday
print(type(weekday.wednesday)) # <enum 'weekday'>
print(weekday.wednesday.name) # wednesday
print(weekday.wednesday.value) # 3from enum import enum
from fastapi import fastapi
class modelname(str, enum):
alexnet = "alexnet"
resnet = "resnet"
lenet = "lenet"
app = fastapi()
@app.get("/models/{model_name}")
async def get_model(model_name: modelname):
if model_name is modelname.alexnet:
return {"model_name": model_name, "message": "deep learning ftw!"}
if model_name.value == "lenet":
return {"model_name": model_name, "message": "lecnn all the images"}
return {"model_name": model_name, "message": "have some residuals"}到此这篇关于python fastapi入门安装使用的文章就介绍到这了,更多相关python fastapi入门内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论