|
我年纪轻轻就学会了Python编程
本章目录
一、FastAPI
和Flask类似,FastAPI也是一个web框架,对于实现Restful API非常简单友好,那么就会有人问了,既然都有了Flask为什么还需要使用FastAPI呢?
首先,我们来了解一下什么是FastAPI:
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示使用 Python 3.6+ 构建 API。
主要特点是:
- 快速:非常高的性能,与NodeJS和Go相当(感谢 Starlette 和 Pydantic)。可用的最快的 Python 框架之一。
- 快速编码:将开发功能的速度提高约 200% 到 300%。*
- 更少的错误:减少约 40% 的人为(开发人员)导致的错误。*
- 直观:出色的编辑器支持。到处完成。更少的调试时间。
- 简单:旨在易于使用和学习。减少阅读文档的时间。
- Short : 尽量减少代码重复。每个参数声明的多个功能。更少的错误。
- 健壮:获取生产就绪的代码。具有自动交互式文档。
- 基于标准:基于(并完全兼容)API 的开放标准:OpenAPI(以前称为 Swagger)和JSON Schema。
Web框架性能对比:源自https://www.techempower.com/

安装
- pip install fastapi
- pip install uvicorn
- 可选:pip install uvicorn[standard]
- 可选:pip install python-multipart,支持form-data
FastAPI:GET
# %load ./examples/app1.py
import uvicorn
from fastapi import FastAPI,Request
app = FastAPI()
@app.get('/test')
async def test1():
return {'result': '这是一个GET'}
@app.post('/test/{apiname}')
async def test2(apiname):
"""
/test/<apiname>:后面的apiname表示任意名字
&#34;&#34;&#34;
return {&#39;result&#39;: f&#39;这是一个GET,您请求的是:{apiname}&#39;}
if __name__ == &#39;__main__&#39;:
uvicorn.run(
app = app,
host = &#34;0.0.0.0&#34;,
port = 5678
)
import requests as rq
url = &#39;http://localhost:5678/test&#39;
rq.get(url).json()
output:
{&#39;result&#39;: &#39;这是一个GET&#39;}
import requests as rq
url = &#39;http://localhost:5678/test/heiheihei&#39;
rq.get(url).json()
output:
{&#39;result&#39;: &#39;这是一个GET,您请求的是:heiheihei&#39;}FastAPI:自动生成API文档
直接在启动的接口地址后面写/docs访问即可
- 比如上文接口:http://localhost:5678/docs
FastAPI:POST
# %load ./examples/app2.py
import uvicorn
from fastapi import FastAPI,Request
app = FastAPI()
@app.post(&#39;/test&#39;)
async def test1():
return {&#39;result&#39;: &#39;这是一个POST&#39;}
@app.post(&#39;/test/{apiname}&#39;)
async def test2(apiname, request: Request):
&#34;&#34;&#34;
/test/<apiname>:后面的apiname表示任意名字
&#34;&#34;&#34;
args = await request.json()
return {&#39;result&#39;: f&#39;这是一个POST,您请求的是:{apiname},您的参数是:{args}&#39;}
if __name__ == &#39;__main__&#39;:
uvicorn.run(
app = app,
host = &#34;0.0.0.0&#34;,
port = 5678
)
import requests as rq
url = &#39;http://localhost:5678/test&#39;
rq.post(url).json()
output:
{&#39;result&#39;: &#39;这是一个POST&#39;}
import requests as rq
url = &#39;http://localhost:5678/test/heihei&#39;
args = {&#34;name&#34;: &#34;test&#34;, &#34;passwd&#34;: &#34;123456&#34;}
rq.post(url,json = args).json()
output:
{&#39;result&#39;: &#34;这是一个POST,您请求的是:heihei,您的参数是:{&#39;name&#39;: &#39;test&#39;, &#39;passwd&#39;: &#39;123456&#39;}&#34;}FastAPI:蓝图
蓝图的功能和其它框架很类似,便于管理:
当我们项目非常大,接口非常多的时候,直接书写接口会很难管理,这时就可以使用蓝图功能对此进行分类管理。
# %load ./examples/app3.py
import uvicorn
from fastapi import FastAPI,Request,APIRouter
router = APIRouter(prefix=&#39;/bp&#39;,tags = [&#39;bp&#39;])
# @router.get(&#39;/test&#39;)
# @router.post(&#34;/test&#34;)
@router.api_route(&#34;/test&#34;,methods=[&#39;GET&#39;,&#39;POST&#39;])
async def test1():
return {&#39;result&#39;: &#39;这是一个GET或者POST&#39;}
@router.post(&#39;/test/{apiname}&#39;)
# @router.get(&#39;/test/{apiname}&#39;)
# @router.api_route(&#39;/test/{apiname}&#39;,methods=[&#39;POST&#39;])
async def test2(apiname, request: Request):
&#34;&#34;&#34;
/test/<apiname>:后面的apiname表示任意名字
&#34;&#34;&#34;
args = await request.json()
return {&#39;result&#39;: f&#39;这是一个GET,您请求的是:{apiname},您的参数是:{args}&#39;}
app = FastAPI()
app.include_router(router)
if __name__ == &#39;__main__&#39;:
uvicorn.run(
app = app,
host = &#34;0.0.0.0&#34;,
port = 5678
)
import requests as rq
url = &#39;http://localhost:5678/bp/test&#39;
rq.get(url).json()
output:
{&#39;result&#39;: &#39;这是一个GET或者POST&#39;}
import requests as rq
url = &#39;http://localhost:5678/bp/test&#39;
rq.post(url).json()
output:
{&#39;result&#39;: &#39;这是一个GET或者POST&#39;}
import requests as rq
url = &#39;http://localhost:5678/bp/test/heihei&#39;
args = {&#34;name&#34;: &#34;test&#34;, &#34;passwd&#34;: &#34;123456&#34;}
rq.post(url,json = args).json()
output:
{&#39;result&#39;: &#34;这是一个GET,您请求的是:heihei,您的参数是:{&#39;name&#39;: &#39;test&#39;, &#39;passwd&#39;: &#39;123456&#39;}&#34;}FastAPI:渲染HTNL
# %load ./examples/app4.py
import uvicorn
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
app = FastAPI()
@app.get(&#34;/index&#34;)
async def read_items():
html_content = &#34;&#34;&#34;
<html>
<head>
<title>index</title>
</head>
<body>
<h1>花卷老师真帅!</h1>
</body>
</html>
&#34;&#34;&#34;
return HTMLResponse(content=html_content, status_code=200)
if __name__ == &#39;__main__&#39;:
uvicorn.run(
app = app,
host = &#34;0.0.0.0&#34;,
port = 5678
)渲染本地HTML文件
# %load ./examples/app5.py
import uvicorn
from fastapi import FastAPI
# 导入Request上下文对象,用来在前后台之间传递参数
from starlette.requests import Request
from starlette.staticfiles import StaticFiles
# 导入jinja2模板引擎对象,用于后续使用
from starlette.templating import Jinja2Templates
app = FastAPI()
app.mount(&#34;/static&#34;, StaticFiles(directory=&#34;static&#34;), name=&#34;static&#34;)
# 实例化一个模板引擎对象,指定模板所在路径
templates=Jinja2Templates(directory=&#39;templates&#39;)
@app.get(&#34;/sign&#34;)
async def read_items(request: Request):
# 返回一个模板对象,同时使用上下文中的数据对模板进行渲染
return templates.TemplateResponse(name=&#39;sign.html&#39;,context = {&#39;request&#39;:request})
@app.post(&#34;/sign&#34;)
async def read_sign(request: Request):
args = await request.form()
username = args[&#39;username&#39;]
passwd = args[&#39;password&#39;]
print(username,passwd)
# 返回一个模板对象,同时使用上下文中的数据对模板进行渲染
if username == &#39;test&#39; and passwd == &#39;123456&#39;:
return templates.TemplateResponse(name=&#39;success.html&#39;,context = {&#39;request&#39;:request,&#39;username&#39;:username})
return templates.TemplateResponse(name=&#39;bad.html&#39;,context = {&#39;request&#39;:request})
if __name__ == &#39;__main__&#39;:
uvicorn.run(
app = app,
host = &#34;0.0.0.0&#34;,
port = 5678
)::: tip 提示 更多教程访问官网:https://fastapi.tiangolo.com :::
小结
- Flask:轻量型网站
- FastAPI:更适用于实现API
- Django:大型网站
赞赏
读后若有收获,可以微信请作者喝咖啡:
 |
|