有两个类似的 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) 我正在使用 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,并且在幕后似乎使用websockets。websockets.connect默认情况下使用 20 秒的 aping_interval和ping_timeout,但我不知道 FastAPI 中是否使用了它。
所以我目前正在开发一个为多种 NLP 服务提供服务的 FastAPI 项目。为此,我想提供来自 spacy 和 Huggingface 的不同模型。
由于这些模型非常大,因此为每个发布请求加载模型时的推理时间非常长。我的想法是在 FastAPI 启动时加载所有模型(在 app/main.py 中),但是,我不确定这是否是一个好的选择/想法,或者这种方法是否有一些缺点,因为模型会在缓存中(?)。(信息:我想对项目进行 dockerize,然后将其部署在虚拟机上)
到目前为止,我无法在互联网上找到任何指导,所以我希望在这里得到一个好的答案:)
提前致谢!
在 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) 我想将一个简单的 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
非常感谢帮助!
我正在 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) 我刚刚开始使用 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) 我需要创建一个模式,但它有一个名为global的列,当我尝试编写此内容时,出现错误。
class User(BaseModel):
id:int
global:bool
Run Code Online (Sandbox Code Playgroud)
我尝试使用另一个名称,但在尝试保存在数据库中时出现另一个错误。
我是 FastAPI 的新手,在导入其他文件时遇到了这个问题。
\n我收到错误:\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d
\nfrom . import schemas\nImportError: attempted relative import with no known parent package\nRun Code Online (Sandbox Code Playgroud)\n对于上下文,我从中导入的文件是一个名为 Blog 的文件夹。我看到某些 StackOverflow 答案说from . import schemas我应该写from Blog import schemas. 即使他们的解决方案是正确的,并且我在运行 python 程序时没有收到任何错误,当我尝试使用 uvicorn 运行 FastAPI 时,我收到此错误,并且我的本地主机页面未加载。
File "./main.py", line 2, in <module>\nfrom Blog import schemas\nModuleNotFoundError: No module named \'Blog\'\nRun Code Online (Sandbox Code Playgroud)\n\n主文件的代码如下所示:
\nfrom 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\nRun Code Online (Sandbox Code Playgroud)\n模式.py
\n …我正在使用nsidnev/fastapi-realworld-example-app。
我需要将事务逻辑应用到这个项目中。
在一个 API 中,我从存储库调用许多方法,并在许多表中执行更新、插入和删除操作。如果这些操作出现异常,我该如何回滚更改?(或者如果一切正确则提交。)
fastapi ×10
python ×7
pydantic ×4
deployment ×2
python-3.x ×2
uvicorn ×2
asyncpg ×1
azure ×1
caching ×1
geojson ×1
nest-asyncio ×1
sqlalchemy ×1
starlette ×1
swagger-ui ×1
websocket ×1