from fastapi import Depends, FastAPI
app = FastAPI()
defget_query(background_tasks: BackgroundTasks, q: str = Depends(query_depend)):
# Some async logic here result = some_function(q)
# Enqueue a background task background_tasks.add_task(some_background_task, result)
# Yield the resultyield result
当执行到 yield result 时,会先暂停执行 get_query 函数,执行路径操作函数,然后再在路径操作函数执行完毕后继续执行 get_query 函数中的 yield result 之后的逻辑。
(2)后台任务(Background Tasks)
后台任务允许你在路径操作函数执行完毕后异步执行一些逻辑。
它通常用于执行一些与请求响应过程无关的异步任务,如发送邮件、保存日志等。
示例:
from fastapi import BackgroundTasks, FastAPI
app = FastAPI()
defsome_background_task(result):
print(f"Doing some background work with {result}")
@app.post("/send-notification/{email}")asyncdefsend_notification( email: str, background_tasks: BackgroundTasks
):
# Some async logic here result = some_function(email)
# Enqueue a background task background_tasks.add_task(some_background_task, result)
return {"message": "Message sent"}
(venv) PS E:\projects\turtorial> pytest
======================================== test session starts ========================================
platform win32 -- Python 3.9.13, pytest-6.2.1, py-1.10.0, pluggy-0.13.1
rootdir: E:\projects\turtorial
collected 0 items / 1 error
============================================== ERRORS ===============================================
________________________________ ERROR collecting test_chapter08.py _________________________________
test_chapter08.py:7: in <module>
from run import app
..\run.py:32: in <module>
app.mount(path='/static', app=StaticFiles(directory='./coronavirus/static'), name='static')
..\..\venv\lib\site-packages\starlette\staticfiles.py:55: in __init__
raise RuntimeError(f"Directory '{directory}' does not exist")
E RuntimeError: Directory './coronavirus/static' does not exist
------------------------------------------ Captured stdout ------------------------------------------
2023-10-01 15:23:10,546 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR
(60)) AS anon_1
2023-10-01 15:23:10,546 INFO sqlalchemy.engine.base.Engine ()
2023-10-01 15:23:10,546 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCH
AR(60)) AS anon_1
2023-10-01 15:23:10,546 INFO sqlalchemy.engine.base.Engine ()
2023-10-01 15:23:10,547 INFO sqlalchemy.engine.base.Engine PRAGMA main.table_info("city")
2023-10-01 15:23:10,547 INFO sqlalchemy.engine.base.Engine ()
2023-10-01 15:23:10,547 INFO sqlalchemy.engine.base.Engine PRAGMA temp.table_info("city")
2023-10-01 15:23:10,548 INFO sqlalchemy.engine.base.Engine ()
2023-10-01 15:23:10,548 INFO sqlalchemy.engine.base.Engine PRAGMA main.table_info("data")
2023-10-01 15:23:10,548 INFO sqlalchemy.engine.base.Engine ()
2023-10-01 15:23:10,548 INFO sqlalchemy.engine.base.Engine PRAGMA temp.table_info("data")
2023-10-01 15:23:10,548 INFO sqlalchemy.engine.base.Engine ()
2023-10-01 15:23:10,549 INFO sqlalchemy.engine.base.Engine
CREATE TABLE city (
id INTEGER NOT NULL,
province VARCHAR(100) NOT NULL,
country VARCHAR(100) NOT NULL,
country_code VARCHAR(100) NOT NULL,
country_population BIGINT NOT NULL,
created_at DATETIME DEFAULT (CURRENT_TIMESTAMP),
updated_at DATETIME DEFAULT (CURRENT_TIMESTAMP),
PRIMARY KEY (id),
UNIQUE (province)
)
2023-10-01 15:23:10,549 INFO sqlalchemy.engine.base.Engine ()
2023-10-01 15:23:10,942 INFO sqlalchemy.engine.base.Engine COMMIT
2023-10-01 15:23:10,942 INFO sqlalchemy.engine.base.Engine CREATE INDEX ix_city_id ON city (id)
2023-10-01 15:23:10,942 INFO sqlalchemy.engine.base.Engine ()
2023-10-01 15:23:11,216 INFO sqlalchemy.engine.base.Engine COMMIT
2023-10-01 15:23:11,216 INFO sqlalchemy.engine.base.Engine
CREATE TABLE data (
id INTEGER NOT NULL,
city_id INTEGER,
date DATE NOT NULL,
confirmed BIGINT NOT NULL,
deaths BIGINT NOT NULL,
recovered BIGINT NOT NULL,
created_at DATETIME DEFAULT (CURRENT_TIMESTAMP),
updated_at DATETIME DEFAULT (CURRENT_TIMESTAMP),
PRIMARY KEY (id),
FOREIGN KEY(city_id) REFERENCES city (id)
)
2023-10-01 15:23:11,216 INFO sqlalchemy.engine.base.Engine ()
2023-10-01 15:23:11,456 INFO sqlalchemy.engine.base.Engine COMMIT
2023-10-01 15:23:11,456 INFO sqlalchemy.engine.base.Engine CREATE INDEX ix_data_id ON data (id)
2023-10-01 15:23:11,456 INFO sqlalchemy.engine.base.Engine ()
2023-10-01 15:23:11,696 INFO sqlalchemy.engine.base.Engine COMMIT
========================================= warnings summary ==========================================
<string>:2
<string>:2
<string>:2: SADeprecationWarning: The mapper.order_by parameter is deprecated, and will be removed i
n a future release. Use Query.order_by() to determine the ordering of a result set.
-- Docs: https://docs.pytest.org/en/stable/warnings.html
====================================== short test summary info ======================================
ERROR test_chapter08.py - RuntimeError: Directory './coronavirus/static' does not exist
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
=================================== 2 warnings, 1 error in 2.48s ====================================
(venv) PS E:\projects\turtorial>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示