FastAPI通过自己的依赖解析机制提供了一种管理依赖的方法,比如数据库连接。
它类似于pytest夹具系统。简而言之,您在函数签名中声明您需要的内容,FastAPI 将调用您提到的函数(或类)并在调用处理程序时注入正确的结果。
是的,它确实缓存(在单个处理程序运行期间),但是我们不能仅使用@lru_cache装饰器并在每次运行时简单地调用这些依赖项来实现相同的功能吗?我错过了什么吗?
我正在尝试让 FastAPI 与 Svelte 一起工作。我已经使用 Svelte 构建了静态文件,现在我尝试通过 FastAPI 提供它们。问题是构建的 Svelte 文件global.css从根目录引用,这意味着我无法将它们安装在子文件夹中。
相反,我必须将它们安装在 root 上:
app.mount("/", StaticFiles(directory="web/public", html=True), name="web")
Run Code Online (Sandbox Code Playgroud)
然而,这使得路由(函数装饰器)中定义的任何内容都无法访问。
是否可以同时定义静态文件和函数?任何一个,
a) 路由优先,如果没有路由,它会尝试从静态目录中读取
b) 静态目录优先,我指定了一个排除路径,该路径改为路由
我正在将 FastAPI 与 Pydantic 结合使用。
我的问题 - 我需要使用 Pydantic 引发 ValueError
from fastapi import FastAPI
from pydantic import BaseModel, validator
from fastapi import Depends, HTTPException
app = FastAPI()
class RankInput(BaseModel):
rank: int
@validator('rank')
def check_if_value_in_range(cls, v):
"""
check if input rank is within range
"""
if not 0 < v < 1000001:
raise ValueError("Rank Value Must be within range (0,1000000)")
#raise HTTPException(status_code=400, detail="Rank Value Error") - this works But I am looking for a solution using ValueError
return v
def …Run Code Online (Sandbox Code Playgroud) 我正在使用 FastAPI 在 python 中创建一个服务器,并且我想要一个与我的 API 无关的函数,每 5 分钟在后台运行一次(例如从 API 检查内容并根据响应打印内容)
我尝试创建一个运行该函数的线程start_worker,但它不打印任何内容。
有谁知道该怎么做?
def start_worker():
print('[main]: starting worker...')
my_worker = worker.Worker()
my_worker.working_loop() # this function prints "hello" every 5 seconds
if __name__ == '__main__':
print('[main]: starting...')
uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
_worker_thread = Thread(target=start_worker, daemon=False)
_worker_thread.start()
Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序,我需要根据逻辑有两组完全不同的响应结构。
有什么方法可以处理这个问题,以便我可以序列化、验证和返回两个不同的响应模型并反映在 OpenAPI JSON 中?
我正在使用 pydantic 来编写模型。
所以我已经想出了如何编写 fastAPI 并且我准备将我的脚本部署到我使用过 fastAPI ( https://fastapi.tiangolo.com/ ) 的heroku但是问题是当我向 heroku 发出请求时它只会返回:
<html>
<head>
<title>Internal Server Error</title>
</head>
<body>
<h1><p>Internal Server Error</p></h1>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这意味着脚本已打开,但我看不到错误,并且我会说在本地它完全正常。
我无法看到问题所在的任何日志,但是我想说我的问题可能是我不确定我的procfile是否正确,因为我根本没有编辑它而且我对此很陌生,我在这里请问我如何能够在heroku中运行我的fastapi脚本?
我所知道的是,为了能够运行脚本,您必须使用命令uvicorn main:app --reload,如果您这样做,它将无法工作等py main.py我做错了什么?
我是 fastapi 新手。我使用过其他语言的多个 Web 框架,并发现了用于各种目的的中间件的通用模式。例如,如果我有一个想要进行身份验证的 API 路由,那么我会使用一个中间件来进行身份验证。如果我想增加传入请求,我会使用中间件。FastAPI 确实有中间件(文档中很小的一部分),但也有依赖项。我希望验证我的 API 路由,并开始寻找示例,我发现的所有示例都使用依赖项。建议采用什么方式(依赖项或中间件)来验证 API 路由?为什么?
我正在尝试使用 SSL 运行 fastapi 应用程序。
我正在使用 uvicorn 运行该应用程序。
我可以使用 HTTP 在端口 80 上运行服务器,
if __name__ == '__main__':
uvicorn.run("main:app", port=80, host='0.0.0.0', reload = True, reload_dirs = ["html_files"])
Run Code Online (Sandbox Code Playgroud)
要使用 HTTPS 运行端口,我执行以下操作:
if __name__ == '__main__':
uvicorn.run("main:app", port=443, host='0.0.0.0', reload = True, reload_dirs = ["html_files"], ssl_keyfile="/etc/letsencrypt/live/my_domain/privkey.pem", ssl_certfile="/etc/letsencrypt/live/my_domain/fullchain.pem")
Run Code Online (Sandbox Code Playgroud)
我如何运行两者或简单地集成 https 重定向?
注意:这是在我不想使用 nginx 的服务器上进行的设置,我知道如何使用 nginx 来实现 https 重定向。
我们的 API 中有 CRUD 函数,它使用 FastAPI 和 SQLAlchemy。
对于更新功能,我们有以下代码:
def update_user(
user_id: uuid.UUID,
db: Session,
update_model: UserUpdateModel,
) -> bool:
query = (
db.query(User)
.filter(
User.user_id == user_id,
)
.update(update_model, synchronize_session=False)
)
try:
db.commit()
except IntegrityError as e:
if isinstance(e.orig, PG2UniqueViolation):
raise UniqueViolation from e
return bool(query)
Run Code Online (Sandbox Code Playgroud)
“synchronize_session=False”在这里到底是做什么的?
它的最佳价值是什么?假的还是获取的……?
如果我们不使用它,这很重要吗?
在 pydantic 中,有一种更干净的方法可以从模型中排除多个字段,例如:
class User(UserBase):
class Config:
exclude = ['user_id', 'some_other_field']
Run Code Online (Sandbox Code Playgroud)
我知道以下有效。
class User(UserBase):
class Config:
fields = {'user_id': {'exclude':True},
'some_other_field': {'exclude':True}
}
Run Code Online (Sandbox Code Playgroud)
但我一直在寻找像 django Rest Framework 这样更干净的东西,你可以在其中指定排除或包含的列表。