标签: fastapi

如何扩展 Pydantic 对象并更改某些字段的类型?

有两个类似的 pydantic 对象。唯一的区别是有些字段是可选的。如何只定义一个对象中的字段并扩展到另一个对象中?

class ProjectCreateObject(BaseModel):
    project_id: str
    project_name: str
    project_type: ProjectTypeEnum
    depot: str
    system: str
    ...

class ProjectPatchObject(ProjectCreateObject):
    project_id: str
    project_name: Optional[str]
    project_type: Optional[ProjectTypeEnum]
    depot: Optional[str]
    system: Optional[str]
    ...

Run Code Online (Sandbox Code Playgroud)

python python-3.x pydantic fastapi

10
推荐指数
1
解决办法
2万
查看次数

FastAPI websocket ping/pong 超时

我正在使用 FastAPI 来@app.websocket监听传入的 websocket。FastAPI(或下面的 Starlette 或 Uvicorn)如何进行 ping/pong 心跳?这是可配置的吗?我根本无法在文档中找到它。

from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket("/")
def ws(websocket: WebSocket):
    pass
Run Code Online (Sandbox Code Playgroud)

fastapi使用starlette,并且在幕后似乎使用websocketswebsockets.connect默认情况下使用 20 秒的 aping_intervalping_timeout,但我不知道 FastAPI 中是否使用了它。

websocket starlette fastapi uvicorn

10
推荐指数
1
解决办法
8587
查看次数

启动时加载 FastAPI 项目中的模型

所以我目前正在开发一个为多种 NLP 服务提供服务的 FastAPI 项目。为此,我想提供来自 spacy 和 Huggingface 的不同模型。

由于这些模型非常大,因此为每个发布请求加载模型时的推理时间非常长。我的想法是在 FastAPI 启动时加载所有模型(在 app/main.py 中),但是,我不确定这是否是一个好的选择/想法,或者这种方法是否有一些缺点,因为模型会在缓存中(?)。(信息:我想对项目进行 dockerize,然后将其部署在虚拟机上)

到目前为止,我无法在互联网上找到任何指导,所以我希望在这里得到一个好的答案:)

提前致谢!

deployment fastapi

10
推荐指数
1
解决办法
4986
查看次数

如何在 python dot env 文件中定义列表?

在 Fast API 文档中建议使用 .env 来加载配置。只是据我所知它只支持字符串。

from fastapi import FastAPI
from pydantic import BaseSettings


class Settings(BaseSettings):
    api_tokens = []

    class Config:
        env_file = ".env"


settings = Settings()
app = FastAPI()

Run Code Online (Sandbox Code Playgroud)

我通常每隔几个月更改一次 API 令牌,将新的令牌添加到列表中,并在一段时间后删除旧的令牌。这为用户提供了足够的时间升级到最新版本而不会造成任何中断。同时,两个 API 令牌都将在一段时间内有效。

但我无法在文件中定义列表.env

API_TOKENS = abc123,abc321
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

更新:

这实际上是可能的。下面的答案是正确的,但是我仍然必须像这样更改类型:

class Settings(BaseSettings):
    api_tokens: list
Run Code Online (Sandbox Code Playgroud)

python pydantic fastapi python-dotenv

10
推荐指数
1
解决办法
1万
查看次数

在 Azure 应用服务上部署 FastAPI 和 uvicorn

我想将一个简单的 FastAPI/uvicorn 部署到 Azure 应用程序服务上。

每次部署时,一切似乎都运行顺利,但当我输入 Web 应用程序的 URL 时,我会收到以下错误消息:

“错误信息

在我的本地机器上,uvicorn 工作正常。在我的网络服务上,我运行 python 3.7 和 fastapi 0.62.0。

每次部署时,我都会启动一个名为startup.sh的文档,其中仅包含一行代码:

python -m uvicorn main:app --host 0.0.0.0 --port 80

非常感谢帮助!

deployment azure azure-web-app-service fastapi uvicorn

10
推荐指数
2
解决办法
1万
查看次数

在异步环境中缓存结果

我正在 FastAPI 端点中工作,该端点进行 I/O 绑定操作,该操作是异步的以提高效率。但是,这需要时间,所以我想缓存结果以在一段时间内重复使用。

我目前有这个:

from fastapi import FastAPI
import asyncio

app = FastAPI()

async def _get_expensive_resource(key) -> None:
    await asyncio.sleep(2)
    return True

@app.get('/')
async def get(key):
    return await _get_expensive_resource(key)

if __name__ == "__main__":
    import uvicorn
    uvicorn.run("test:app")
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用该cachetools包来缓存结果,并且我尝试了如下操作:

import asyncio
from cachetools import TTLCache
from fastapi import FastAPI
  
app = FastAPI()

async def _get_expensive_resource(key) -> None:
    await asyncio.sleep(2)
    return True

class ResourceCache(TTLCache):
    def __missing__(self, key):
        loop = asyncio.get_event_loop()
        resource = loop.run_until_complete(_get_expensive_resource(key))
        self[key] = resource
        return resource

resource_cache …
Run Code Online (Sandbox Code Playgroud)

python caching python-asyncio fastapi nest-asyncio

10
推荐指数
1
解决办法
1万
查看次数

fastapi:将 sqlalchemy 数据库模型映射到 pydantic geojson 功能

我刚刚开始使用 FastAPI、SQLAlchemy、Pydantic,我正在尝试构建一个简单的 API 端点,以将 postgis 表中的行作为 geojson 特征集合返回。

这是我的sqlalchemy模型:

class Poi(Base):
    __tablename__ = 'poi'

    id = Column(Integer, primary_key=True)
    name = Column(Text, nullable=False)
    type_id = Column(Integer)
    geometry = Column(Geometry('POINT', 4326, from_text='ST_GeomFromEWKT'),
                      nullable=False)
Run Code Online (Sandbox Code Playgroud)

使用的geojson_pydantic相关pydantic型号有:

from geojson_pydantic.features import Feature, FeatureCollection
from geojson_pydantic.geometries import Point
from typing import List

class PoiProperties(BaseModel):
    name: str
    type_id: int

class PoiFeature(Feature):
    id: int
    geometry: Point
    properties: PoiProperties

class PoiCollection(FeatureCollection):
    features: List[PoiFeature]
Run Code Online (Sandbox Code Playgroud)

期望的输出:

理想情况下,我希望能够检索并返回数据库记录,如下所示:

def get_pois(db: Session, skip: int = 0, limit: int …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy geojson pydantic fastapi

10
推荐指数
1
解决办法
2923
查看次数

如何在 pydantic 模型中使用保留关键字

我需要创建一个模式,但它有一个名为global的列,当我尝试编写此内容时,出现错误。

class User(BaseModel):

    id:int
    global:bool
Run Code Online (Sandbox Code Playgroud)

我尝试使用另一个名称,但在尝试保存在数据库中时出现另一个错误。

python pydantic fastapi

10
推荐指数
1
解决办法
4709
查看次数

FastAPI:“导入错误:尝试在没有已知父包的情况下进行相对导入”

我是 FastAPI 的新手,在导入其他文件时遇到了这个问题。

\n

我收到错误:\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d

\n
from . import schemas\nImportError: attempted relative import with no known parent package\n
Run Code Online (Sandbox Code Playgroud)\n

对于上下文,我从中导入的文件是一个名为 Blog 的文件夹。我看到某些 StackOverflow 答案说from . import schemas我应该写from Blog import schemas. 即使他们的解决方案是正确的,并且我在运行 python 程序时没有收到任何错误,当我尝试使用 uvicorn 运行 FastAPI 时,我收到此错误,并且我的本地主机页面未加载。

\n
  File "./main.py", line 2, in <module>\nfrom Blog import schemas\nModuleNotFoundError: No module named \'Blog\'\n
Run Code Online (Sandbox Code Playgroud)\n

文件结构如下所示:\n在此输入图像描述

\n

主文件的代码如下所示:

\n
from fastapi import FastAPI\nfrom Blog import schemas, models\nfrom database import engine\n\napp = FastAPI()\n\nmodels.Base.metadata.create_all(engine)\n\n\n@app.post(\'/blog\')\ndef create(request: schemas.Blog):\n    return request\n
Run Code Online (Sandbox Code Playgroud)\n

模式.py

\n …

python python-3.x swagger-ui fastapi

10
推荐指数
2
解决办法
1万
查看次数

如何在 FastAPI RealWorld 示例应用程序中应用事务逻辑?

我正在使用nsidnev/fastapi-realworld-example-app

我需要将事务逻辑应用到这个项目中。

在一个 API 中,我从存储库调用许多方法,并在许多表中执行更新、插入和删除操作。如果这些操作出现异常,我该如何回滚更改?(或者如果一切正确则提交。)

python asyncpg fastapi

9
推荐指数
1
解决办法
1925
查看次数