ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

FastAPI系列 类作为依赖项

2021-06-08 18:35:04  阅读:231  来源: 互联网

标签:依赖 系列 FastAPI commons Depends skip items CommonQueryParams


一、类依赖项

 在之前的依赖注入中使用的依赖项都是函数,是不是就意味着依赖项必需是函数呢?当然不是,决定是否可以当作依赖项的关键因素就是是否是"可调用"。

如果一个对象是“可调用”的,那么它就可以作为依赖项。所以显然函数和类都是可被调用的,那么类如何作为依赖项。

from typing import Optional
from fastapi import FastAPI

app = FastAPI()


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

显然,类被调用后是一个实例,上述CommonQueryParams类可以作为一个依赖项,然后将之前的参数传给这个类。

现在可以使用这个类依赖项:

from typing import Optional
from fastapi import Depends, FastAPI

app = FastAPI()

items = [
    {"name": "apple", "price": "1.12"},
    {"name": "pear", "price": "3.14"}
]


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


@app.get("/items/")
async def read_items(commons: CommonQueryParams = Depends(CommonQueryParams)):
    response = {}
    if commons.q:
        response.update({"q": commons.q})
    result = items[commons.skip:commons.skip + commons.limit]
    response.update({"result": result})
    return response

这与函数作为依赖项大同小异,当请求到来后,FastAPI调用依赖类CommonQueryParams,这个类创建实例并且实例作为参数传递给路径操作函数。

二、类型声明与Depends

当使用过函数作为依赖项,并且在路径操作函数中进行类型声明是这样的:

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

dict为类型声明,Depends中传递依赖项。在类中也使用了一样的方式:

...
@app.get("/items/")
async def read_items(commons: CommonQueryParams = Depends(CommonQueryParams)):
    response = {}
    if commons.q:
        response.update({"q": commons.q})
    result = items[commons.skip:commons.skip + commons.limit]
    response.update({"result": result})
    return response
...
  • Depends(CommonQueryParams))

在这里,实际上真正有作用的是Depends中传递的CommonQueryParams,FastAPI将会抽取声明的参数以及真正调用。

  • commons: CommonQueryParams

这里的CommonQueryParams并没有任何特殊的意义,FastAPI不会使用它进行数据转换、校验等。

所以完全可以写成以下形式:

commons = Depends(CommonQueryParams)

或者另一种写法就是声明依赖类为commons参数的类型,而Depends作为函数参数的默认值。

commons: CommonQueryParams = Depends()

 

标签:依赖,系列,FastAPI,commons,Depends,skip,items,CommonQueryParams
来源: https://www.cnblogs.com/shenjianping/p/14860886.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有