这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战
Part1背景
通常在我们开发 app 时都会用到路由,像 Flask 有 blueprint,Django 有 urls 等,其目的都是为了路由汇总管理。FastApi 也不例外,其拥有 APIRouter。今天我们就一起来了解 APIRouter 是如何使用的。
Part2项目结构
项目目录
以上,
model为模型层,templates为html模板,views为视图(其中每个视图都有其独立的路由器),main为app入口,所有的APIRouter都在这里注册。
Part3代码
1视图中路由器的定义和使用
views目录中user.py
from fastapi import FastAPI,Depends,Header,HTTPException,APIRouter
from starlette.requests import Request
from starlette.templating import Jinja2Templates
from starlette import status
import uvicorn
from deta import Deta
from fastapi.responses import StreamingResponse
# 实例化路由器
router = APIRouter()
templates = Jinja2Templates('templates')
# 注意,视图这里使用router来声明请求方式&URI
@router.get('/users/')
def user_list():
return "这是用户们"
@router.get('/imgs/')
def img_list():
return "这是图片"
2main 中的路由器注册
from fastapi import Depends, FastAPI
from views import utm,openstack,user
from views.utm import login_required
import uvicorn
# 如果需要开启app鉴权,则用这种方式↓
# app = FastAPI(dependencies=[Depends(login_required)])
app = FastAPI() # 免鉴权
app.include_router(
user.router,
prefix='/um',
tags=['um'],
responses={520: {"description": "I'm a user description!"}}
)
@app.get("/")
async def root():
return {"message": "Welcome to Applications APIRouter!"}
if __name__ == "__main__":
uvicorn.run(app='main:app',host='127.0.0.1',port=8765,reload=True)
3浏览器访问
根路由
um路由到users
um路由到imgs
4将图片展示出来
眼尖的同学可能已经注意到,上面对于图片的展示是用文字来替代的,那怎么样将图片展示出来呢?答案是用 FastApi 中的 StreamingResponse 对象来进行响应。
@router.get('/imgs/')
def img_list():
#return "这是图片"
file_like = open('templates/baidu.png', mode="rb")
return StreamingResponse(file_like, media_type="image/jpg")
再次访问:localhost:8765/um/imgs/
可以看到,图片他已经成功展示。
怎么样,简单吧,你学废了吗?
感谢您的阅读,别忘了关注,点赞,评论,转发四连哟!