FastAPI desde la entrada hasta el combate real (16) - dependencias

La inyección de dependencia es un término familiar. Suena complicado, pero en realidad no es tan complicado. El acceso normal necesita aceptar varios parámetros para construir un objeto. La inyección de dependencia se convierte en solo recibir un objeto instanciado, principalmente para compartir la lógica comercial, compartir la conexión de la base de datos, darse cuenta seguridad, verificación, permisos y otras funciones comerciales relacionadas, este artículo registra principalmente la inyección de dependencia de fastapi.

dependencias funcionales

# 创建、导入、声明依赖
async def user_verification(
        user: str,
        birthday: date,
        age: int
):
    return {
    
    
        "user": user,
        "birthday": birthday,
        "age": age
    }


# 同时依赖于user_verification
@app10.get("/user_verification/test1")
async def user_verification_test1(
        test1: dict = Depends(user_verification)
):
    return test1


@app10.get("/user_verification/test2")
async def user_verification_test2(
        test2: dict = Depends(user_verification),
        test2_param:Optional[str] = None
):
    return {
    
    
        "test2":test2,
        "test2_param":test2_param
    }

El código anterior completa la creación y llamada de una función de dependencia.Primero, se crea una función de dependencia.La user_verificationfunción acepta tres parámetros y devuelve los tres parámetros en forma de diccionario;

Las siguientes dos funciones de operación de rutas son esencialmente las mismas. Para test1, defina un parámetro de tipo dictado test1 para recibir el valor de retorno de la función de dependencia y luego devuelva test1. Además de aceptar los parámetros requeridos por la dependencia, test2 , que user_verificationtambién acepta un argumento para la función decoradora de rutas test2_paramy lo devuelve.

Este ejemplo es un buen ejemplo del uso de funciones de dependencia.El sistema de inyección de dependencia de Fastapi procesará automáticamente todas las dependencias y sus subdependencias, e inyectará resultados para cada paso de la operación.

  • http://127.0.0.1:8000/stu/user_verification/test1?user=MinChess&birthday=2021-12-23&age=11

[Error en la transferencia de imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-vw6YEGkL-1672050817200) (https://kodo.jiumoz.com/imgs/ 202212221801866.png)]

  • http://127.0.0.1:8000/stu/user_verification/test2?test2_param=%E6%9C%AC%E8%BA%AB%E7%9A%84%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0&user=%E4%B9%9D%E9%99%8C%E6%96%8B&birthday=2012-12-03&age=23

imagen-20221222181048641

dependencias de clase

# 类作为依赖项
class User:
    def __init__(self, name: str, age: Optional[str], birthday: date):
        self.name = name
        self.age = age
        self.birthday = birthday


@app10.get("/stu10_UserClass")
async def stu10_UserClass(
        user: User = Depends(User)
):
    return user

Una clase de usuario se define arriba. En el constructor predeterminado, además del parámetro propio predeterminado, se especifican tres parámetros adicionales, que es lo mismo que en el ejemplo anterior; la especificación adicional del parámetro de usuario en la función de modificación de ruta depende de la clase de usuario .

FastAPI llama a la clase User para crear una "instancia" de esta clase, que se pasa a la función de modificación de ruta como el usuario de parámetros.

imagen-20221222181813704

dependencia de múltiples capas

# 多层依赖

def first_verification(
        param1: Optional[str] = None
):
    print(param1)
    return param1


def second_verification(
        param_1: str = Depends(first_verification),
        param_2: Optional[str] = None
):
    if not param_1:
        return param_2
    return param_1


@app10.get("/stu10_more_verification")
async def stu10_more_vberification(
        param: str = Depends(second_verification)
):
    return {
    
    "param": param}

Este código contiene tres funciones, la primera función es la dependencia de primer nivel, declara un parámetro opcional param1 y devuelve este parámetro;

El segundo parámetro es otra función de dependencia, que a su vez también depende de la primera función de dependencia, para determinar qué valor se pasa y devolver si hay un valor;

La última función de operación de ruta declara un parámetro param, depende de la segunda función de dependencia y finalmente devuelve el parámetro param.

Para fastapi, las dependencias multicapa se procesan capa por capa, primero procesando la primera y luego procesando la segunda.

Si la misma dependencia se declara varias veces en la misma operación de ruta , por ejemplo, varias dependencias comparten una subdependencia, FastAPI solo llamará a la subdependencia una vez al procesar la misma solicitud.

FastAPI no llama a la misma dependencia varias veces para la misma solicitud, pero "almacena en caché" el valor devuelto de la dependencia y lo pasa a todas las "dependencias" que necesitan usar el valor devuelto en la misma solicitud.

imagen-20221223162757034

imagen-20221223162816998

Dependencias del decorador de manipulación de ruta

# 路径操作装饰器依赖项
async def verify_token(x_token: str = Header()):
    if x_token != "fake-super-secret-token":
        raise HTTPException(status_code=400, detail="X-Token header invalid")


async def verify_key(x_key: str = Header()):
    if x_key != "fake-super-secret-key":
        raise HTTPException(status_code=400, detail="X-Key header invalid")
    return x_key


@app10.get("/stu10/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
async def read_items():
    return [{
    
    "item": "Foo"}, {
    
    "item": "Bar"}]

La explicación de la documentación oficial es: a veces, no necesitamos usar el valor de retorno de la dependencia en la función de operación de ruta .

O bien, algunas dependencias no devuelven un valor.

Pero aún ejecute o resuelva esa dependencia.

Para este caso, en lugar de usarlo al declarar los parámetros de la función de operación de rutaDepends , puede agregar un decorador de operación de rutadependencies que consta de list.

Como en el código anterior, agregue un parámetro al decorador de operación de ruta dependencies, que se Depends()compone de list.

Sus métodos de resolución y ejecución son los mismos que las dependencias ordinarias, pero sus valores no se pasan a la función de operación de ruta, y ya sea que haya un valor de retorno o no, la operación de ruta no usará estos valores.

imagen-20221226162153311

dependencias globales

async def main_depends():
    print("main depends")


app = FastAPI(
    title='FastAPI学习教程文档——title',
    description='这是FastAPI教程的文档——description',
    version='1.0.0',
    docs_url='/docs',
    redoc_url='/redoc',
    dependencies=[Depends(main_depends)]
)

Las dependencias globales son para agregar dependencias para toda la aplicación. El método de adición es similar a la definición de dependencias del decorador de ruta. Las dependencias se pueden agregar a toda la aplicación principal de FastAPI.

Lo anterior es para agregar parámetros en la aplicación FastAPI dependencies.

Con esto, todas las operaciones de ruta se basarán en las funciones de dependencia anteriores de forma predeterminada.

De la siguiente manera, si visita cualquier ruta a voluntad, la consola imprimirámain depends

imagen-20221226163722379

Usar rendimiento en dependencias

# 依赖项中使用yield
async def get_yield():
    try:
        yield "yield param"
    finally:
        print("yield end!")


@app10.get("/stu10/yield")
async def stu10_yield(
        yieldparam: str = Depends(get_yield)
):
    return {
    
    
        "yield_param": yieldparam
    }

FastAPI admite la realización de algunos pasos adicionales después de que se devuelvan las dependencias, pero debe usar yield en lugar de return para lograrlo.

Es decir, es necesario realizar algunas operaciones después de que la función de dependencia devuelva un valor y, en ese momento, es necesario utilizar yieldpalabras clave .

Como en el código anterior, yield paramcontinúe imprimiendo después de regresar yield end!. Aquí registramos principalmente el uso simple de yield. Para obtener más información, consulte la introducción del sitio web oficial a continuación.

También puede confiar en varias capas y hay muchos contenidos de bajo nivel, puede consultar el sitio web oficial: https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/

imagen-20221226182224122


¡Gracias por leer!

Dirección de Jiumozhai: https://blog.jiumoz.com/archives/fastapi-cong-ru-men-dao-shi-zhan-16-yi-lai-xiang

¡Bienvenido a seguir el mini programa personal del blogger!

Supongo que te gusta

Origin blog.csdn.net/qq_45730223/article/details/128447883
Recomendado
Clasificación