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_verification
funció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_verification
también acepta un argumento para la función decoradora de rutastest2_param
y 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
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
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.
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.
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 ruta
Depends
, puede agregar un decorador de operación de rutadependencies
que consta delist
.Como en el código anterior, agregue un parámetro al decorador de operación de ruta
dependencies
, que seDepends()
compone delist
.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.
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
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
yield
palabras clave .Como en el código anterior,
yield param
continúe imprimiendo después de regresaryield 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/
¡Gracias por leer!
Dirección de Jiumozhai: https://blog.jiumoz.com/archives/fastapi-cong-ru-men-dao-shi-zhan-16-yi-lai-xiang