python:Fastapi - 依赖项操作

简单絮叨一些

前面一篇文章唠了异常处理和路径操作配置,今天主要唠下依赖项

Fastapi中提供了依赖注入系统,怎么理解呢?

其实就是本来我是要接收很多参数来构造对象,现在我只接收一个已经实例化的对象。

网上很多的抽象解读,感觉看多了,都emo了,虽说上述总结的一句话比较狭义,但是并没有偏多少,主旨是存在的。

依赖注入常用于以下场景:

上述场景均可以使用依赖注入,将代码重复最小化。



依赖项


初识依赖项

依赖项的使用必须要导入Depends,它是Fastapi提供的专门处理依赖的

import uvicorn
from typing import Optional
from fastapi import FastAPI
from fastapi import Depends

app = FastAPI()


def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 10):
    return {"q": q, "skip": skip, "limit": limit}


@app.get("/items/")
def read_items(commons: dict = Depends(common_parameters)):
    return commons


@app.get("/users/")
def read_user(commons: dict = Depends(common_parameters)):
    return commons


if __name__ == '__main__':
    uvicorn.run(app="dependency_main:app", reload=True, debug=True)

注释信息:

注意点:


python:Fastapi - 依赖项操作



子依赖项

Fastapi支持创建含子依赖项的依赖项,并且,可以按需声明任意深度的子依赖项嵌套层级。

import uvicorn
from typing import Optional
from fastapi import FastAPI
from fastapi import Depends
from fastapi import Cookie

app = FastAPI()


def parent_parameters(q: Optional[str] = None):
    return q


def child_parameters(q: str = Depends(parent_parameters), last_query: Optional[str] = Cookie(None)):
    if not q:
        return last_query
    return q


@app.get("/default/")
def read_default(query_or_default: str = Depends(child_parameters)):
    return {"q_or_cookie": query_or_default}


@app.get("/default_more/")
def read_default_more(query_or_default: str = Depends(child_parameters, use_cache=False)):
    return {"q_or_cookie": query_or_default}


if __name__ == '__main__':
    uvicorn.run(app="dependency_main:app", reload=True, debug=True)

注释信息:

注意点:


python:Fastapi - 依赖项操作



类作为依赖项*

类作为依赖项,其实就是函数作为依赖项的升级版,那这里的类因为注入依赖系统的存在,是不需要进行实例化对象的,只需

要把类名传入,Fastapi会自动分析是不是可调用的参数,如果是可调用的 则以与路径操作函数的参数相同的方式处理它们。

import uvicorn
from typing import Optional
from fastapi import FastAPI
from fastapi import Depends
from fastapi import Cookie

app = FastAPI()


fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


class CommonParameters:

    def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
        self.q = q
        self.skip = skip
        self.limit = limit


@app.get("/object/")
def read_object(commons: CommonParameters = Depends(CommonParameters)):
    response = {}
    if commons.q:
        response.update({"q": commons.q})
        response.update({"name": "lifeng"})
    items = fake_items_db[commons.skip: commons.skip + commons.limit]
    response.update({"items": items})
    return response

注释信息:

注意点:


python:Fastapi - 依赖项操作



路径操作装饰器依赖项

1 - 在路径操作装饰器中添加 dependencies 参数

有时,我们并不需要在路径操作函数中使用依赖项的返回值。或者说,有些依赖项不返回值。那就可以在路径操作装饰器中添加一个由 dependencies 组成的 list

2 - 依赖项错误和返回值

依赖项也可以在路径定义需求项(比如请求头),也可以抛出异常或者return返回值(无论路径装饰器依赖项是否返回值,路径操作都不会使用这些值。)

import uvicorn
from fastapi import FastAPI
from fastapi import Depends
from fastapi import Header
from fastapi import HTTPException

app = FastAPI()


def verify_token(x_token: str = Header(...)):
    if x_token != "li_feng_token":
        raise HTTPException(status_code=400, detail="x_token 未定义!")


def verify_key(x_key: str = Header(...)):
    if x_key != "li_feng_key":
        raise HTTPException(status_code=400, detail="x_key 未定义!")
    return x_key


@app.get("/handle_path/", dependencies=[Depends(verify_token), Depends(verify_key)])
def read_handle_path():
    return [
        {"item": "Foo"},
        {"item": "Bar"}
    ]


if __name__ == '__main__':
    uvicorn.run(app="dependency_main:app", reload=True, debug=True)


python:Fastapi - 依赖项操作



全局依赖项

有时,我们要为整个应用添加依赖项。那就得把依赖项添加至整个 FastAPI 应用。这些依赖项可以用于应用中的所有路径操作。

import uvicorn
from fastapi import Header
from fastapi import FastAPI
from fastapi import Depends
from fastapi import HTTPException


def verify_token(x_token: str = Header(...)):
    if x_token != "li_feng_token":
        raise HTTPException(status_code=400, detail="x_token 未定义!")


def verify_key(x_key: str = Header(...)):
    if x_key != "li_feng_key":
        raise HTTPException(status_code=400, detail="x_key 未定义!")
    return x_key


app = FastAPI(dependencies=[Depends(verify_token), Depends(verify_key)])


@app.get("/items_global/")
def read_items_global():
    return [{"item": "Portal Gun"}, {"item": "Plumbus"}]


@app.get("/users_global/")
def read_users_global():
    return [{"username": "Rick"}, {"username": "Morty"}]


if __name__ == '__main__':
    uvicorn.run(app="dependencies_global_main:app", reload=True, debug=True)

注释信息:


python:Fastapi - 依赖项操作



今天先聊到这里吧,以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;非常期待你的一键 3 连【 点赞、收藏、分享 】哟,谢谢!

未完成,待续……

一直在努力,希望你也是!

微信搜索公众号:就用python

展开阅读全文

页面更新:2024-04-03

标签:操作   注释   路径   函数   定义   对象   声明   参数   未定义   信息

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top