我想将一个简单的 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) 我试图计算出我的客户端可以上传的最大文件大小,以便我的 python fastapi 服务器可以毫无问题地处理它。
我有editors 和articles。许多编辑可能与许多文章相关,并且许多文章可能同时有许多编辑。
我的数据库表是
\n| ID | 主题 | 文本 |
|---|---|---|
| 1 | 新年假期 | 今年...等等等等 |
| ID | 姓名 | 电子邮件 |
|---|---|---|
| 1 | 约翰·史密斯 | 一些@电子邮件 |
| 编辑ID | 文章编号 |
|---|---|
| 1 | 1 |
我的模型是
\nfrom sqlalchemy import Boolean, Column, Integer, String, ForeignKey\nfrom sqlalchemy.orm import relationship\n\nfrom database import Base\n\nclass Editor(Base):\n __tablename__ = "editor"\n\n id = Column(Integer, primary_key=True, index=True)\n name = Column(String(32), unique=False, index=False, nullable=True)\n email = Column(String(115), …Run Code Online (Sandbox Code Playgroud) 我的记录器看起来像这样:
log_config = {
"version": 1,
"disable_existing_loggers": True,
"formatters": {
"default": {
"()": "uvicorn.logging.DefaultFormatter",
"fmt": "%(asctime)s::%(levelname)s::%(name)s::%(filename)s::%(funcName)s::%(message)s",
"datefmt": "%Y-%m-%dT%H:%M:%S%z",
"use_colors": False,
},
"access": {
"()": "uvicorn.logging.AccessFormatter",
"datefmt": "%Y-%m-%dT%H:%M:%S%z",
"fmt": '%(asctime)s::%(levelprefix)s %(client_addr)s - "%(request_line)s" %(msecs)d %(status_code)s',
"use_colors": False,
},
},
"handlers":
{
"default":
{
"formatter": "default",
"class": 'logging.FileHandler',
"filename": CONFIG[SECTION]["default"]
},
"access":
{
"formatter": "access",
"class": 'logging.FileHandler',
"filename": CONFIG[SECTION]["access"]
},
},
"loggers":
{
"uvicorn": {"handlers": ["default"], "level": "INFO", "propagate": False},
"uvicorn.access": {"handlers": ["access"], "level": "INFO", "propagate": False},
}
}
Run Code Online (Sandbox Code Playgroud)
启动配置:
uvicorn.run(
app="app.main:app", …Run Code Online (Sandbox Code Playgroud) 这是我的文件结构和requirements.txt:

得到ModuleNotFoundError,任何帮助将不胜感激。
主要.py
from fastapi import FastAPI
from .import models
from .database import engine
from .routers import ratings
models.Base.metadata.create_all(bind=engine)
app = FastAPI()
app.include_router(ratings.router)
Run Code Online (Sandbox Code Playgroud) 想象一下有一个这样的应用程序:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
Run Code Online (Sandbox Code Playgroud)
如何item_id在 swagger 中添加路径参数的描述?
即使正在发送有效的请求,我的POST请求仍然会失败并收到响应。我正在尝试创建一个网络应用程序,该应用程序接收上传的带有各种遗传标记的文本文件,并将其发送到张量流模型以进行癌症生存预测。可以在此处找到 github 项目的链接。422JSON
这是POST请求:
df_json = dataframe.to_json(orient='records')
prediction = requests.post('http://backend:8080/prediction/', json=json.loads(df_json), headers={"Content-Type": "application/json"})
Run Code Online (Sandbox Code Playgroud)
这是 pydantic 模型以及 API 端点:
class Userdata(BaseModel):
RPPA_HSPA1A : float
RPPA_XIAP : float
RPPA_CASP7 : float
RPPA_ERBB3 :float
RPPA_SMAD1 : float
RPPA_SYK : float
RPPA_STAT5A : float
RPPA_CD20 : float
RPPA_AKT1_Akt :float
RPPA_BAD : float
RPPA_PARP1 : float
RPPA_MSH2 : float
RPPA_MSH6 : float
RPPA_ACACA : float
RPPA_COL6A1 : float
RPPA_PTCH1 : float
RPPA_AKT1 : float
RPPA_CDKN1B : float …Run Code Online (Sandbox Code Playgroud) 我有一个使用 FastAPI 编写的 python Web 应用程序(通过 uvicorn 运行)。在我的应用程序中,我使用的是标准logging模块,该模块使用TimedRotatingFileHandler. 由于我正在登录文件,因此我担心性能。假设我在一个函数中有 3 条日志消息,每次调用端点时都会调用该函数/test。现在想象 1000 个客户端/test同时请求 - 即向日志文件写入 3000 次。
我担心这会影响应用程序的性能,因为 IO 任务非常耗时。我应该使用某种形式的异步日志记录吗?也许打开一个新线程来写入文件?我尝试用谷歌搜索答案,但没有找到标准化的方法。那么它还需要吗?如果是,我应该如何处理这个问题?谢谢!
fastapi ×10
python ×8
pydantic ×3
uvicorn ×3
logging ×2
sqlalchemy ×2
azure ×1
backend ×1
caching ×1
deployment ×1
geojson ×1
http ×1
http-post ×1
io ×1
nest-asyncio ×1
server-side ×1