赞
踩
好记性不如烂笔头
内容来自 [ 面试宝典-高级难度Fast API面试题合集](https://offer.houxu6.top/tag/Fast API)
FastAPI 是一个现代、快速且高性能的 Python Web 框架,用于构建 RESTful API 和 Web 应用。它基于标准的 Python 类型提示,并结合了 Starlette 和 Pydantic 等库的功能。
优点:
缺点:
应用场景:
总之,FastAPI 是一个理想的工具,特别是在你需要高性能、类型安全和易用性的场景下。
依赖注入(Dependency Injection,简称DI)是一种软件设计模式,它有助于解耦应用程序的组件。在依赖注入中,一个对象的依赖关系不是由该对象自己创建或管理的,而是由外部容器或框架来提供和管理。
这种做法有以下优点:
FastAPI 在其设计中实现了依赖注入机制,允许开发者以声明式的方式定义依赖项,并在需要的地方自动注入它们。以下是 FastAPI 中实现依赖注入的基本步骤:
定义依赖项:
创建一个类或函数作为依赖项,通常会包含一些业务逻辑或者服务功能。
装饰器标记:
使用 Depends
装饰器将依赖项标记为可注入的。这个装饰器告诉 FastAPI 在调用依赖此依赖项的函数时应提供它。
from fastapi import Depends
class MyDependency:
def __init__(self, some_parameter: str):
self.some_parameter = some_parameter
def my_dependency(some_parameter: str) -> MyDependency:
return MyDependency(some_parameter)
@my_dependency # 或者 @Depends(my_dependency)
async def some_endpoint(dependency: MyDependency):
pass
在这个例子中,MyDependency
类被标记为可注入的,然后在 some_endpoint
函数中通过 @my_dependency
装饰器注入。
自动注入:
当 FastAPI 接收到请求并开始处理路由时,它会检查哪些参数是依赖项,并根据需要实例化这些依赖项,然后将其传递给相应的处理函数。
生命周期管理:
FastAPI 还支持依赖项的多种生命周期策略,如单例(Singleton)、线程安全的并发单例(Scoped),以及每次请求都会创建新实例的瞬态(Transient)策略。这使得开发者可以根据需求调整依赖项的行为。
依赖顺序:
如果一个依赖项依赖于另一个依赖项,FastAPI 可以自动解决这些依赖关系,确保按照正确的顺序初始化和注入依赖项。
通过这种方式,FastAPI 提供了一个直观且强大的依赖注入系统,帮助开发者构建松散耦合的应用程序,并简化了依赖管理过程。
OpenAPI 和 Swagger 是与 API 开发相关的规范和工具。
OpenAPI:
OpenAPI(以前称为 Swagger 规范)是一个用于定义 RESTful API 的标准格式。它提供了一种描述 API 结构、端点、请求参数、响应数据等的通用语言,使得开发者可以更容易地理解和使用 API。OpenAPI 规范支持 JSON 和 YAML 格式,并且是跨语言、跨平台的。
Swagger:
Swagger 是一个围绕 OpenAPI 规范构建的工具集。它包括了用于生成、可视化、测试和文档化 API 的各种工具。例如,Swagger UI 是一个交互式的 Web 界面,它可以读取 OpenAPI 规范文件并生成易于使用的 API 文档。
FastAPI 通过集成 Starlette 和 Pydantic 库,实现了对 OpenAPI 和 Swagger 的支持:
类型提示和模型:
FastAPI 使用 Python 类型提示来推断 API 结构,并将其转换为 OpenAPI 规范。同时,FastAPI 利用 Pydantic 库进行数据验证,确保请求和响应的数据符合预期的结构。
自动生成 OpenAPI 规范:
当 FastAPI 应用运行时,它会自动创建一个 OpenAPI 规范文件(通常是 openapi.json
或 openapi.yaml
),该文件包含了所有路由、参数、请求体、响应等内容的详细信息。
内置 Swagger UI 支持:
FastAPI 内置了对 Swagger UI 的支持,可以通过访问 /docs
或 /redoc
路径来查看应用的交互式 API 文档。这些文档直接从生成的 OpenAPI 规范中获取信息,因此始终保持最新。
插件和扩展:
FastAPI 还允许开发者添加额外的插件或扩展来增强其对 OpenAPI 和 Swagger 的支持。这可能包括定制错误处理、添加安全机制、调整文档样式等功能。
总的来说,FastAPI 对 OpenAPI 和 Swagger 的支持使得开发者能够更轻松地设计、实现和文档化他们的 API,同时也提高了 API 的可发现性和可用性。
FastAPI 是一个基于 Python 的现代 Web 开发框架,它利用了 Python 的异步 I/O 功能来实现高性能的网络应用程序。以下是如何 FastAPI 支持异步 I/O 的简要说明:
基于 asyncio
: FastAPI 建立在 asyncio
模块之上,这是 Python 内置的标准库之一,用于编写单线程并发程序。
定义异步路径操作函数: 在 FastAPI 中,你可以使用 async def
定义你的路径操作函数,使其成为协程(coroutine)。这允许它们在事件循环中非阻塞地运行,并等待 I/O 操作完成,而不会阻止其他任务的执行。
依赖注入和异步支持: FastAPI 的依赖注入系统也支持异步依赖。这意味着你可以在需要时异步地初始化或获取依赖项。
Starlette 库: FastAPI 实际上是构建在 Starlette 微框架之上的,而 Starlette 本身提供了对异步处理的支持。因此,FastAPI 可以利用 Starlette 的异步中间件、路由和其他功能。
性能优化: 使用异步编程可以显著提高系统的性能,特别是在高并发场景下,如处理大量的数据库查询、文件读写或其他 I/O 密集型任务。
并行性与扩展性: 异步编程使得 FastAPI 能够更好地处理多个请求,因为不同的请求可以在同一时间被处理,而不必按照顺序逐个完成。这有助于提高服务器资源的利用率,并为高负载下的扩展提供了可能。
兼容性: 尽管 FastAPI 鼓励使用异步编程,但它同时也支持同步代码。如果你有已有的同步代码或者不希望进行异步编程,你可以直接在 FastAPI 中使用同步代码,但可能会牺牲一些性能优势。
综上所述,FastAPI 通过其设计和底层使用的库,提供了全面的异步 I/O 支持,使开发者能够构建出高效、可扩展的 Web 应用程序。
FastAPI 是一个基于 Python 的现代 Web 开发框架,它通过高效和直观的方式处理 HTTP 请求。以下是 FastAPI 处理 HTTP 请求的详细步骤:
路由解析:
依赖注入:
Depends
装饰器)。异步处理:
async def
定义,使其成为协程。这意味着当函数内部有 I/O 密集型操作时,可以利用 asyncio 模块进行非阻塞等待。请求数据解析:
业务逻辑处理:
异常处理:
响应构建:
响应发送:
中间件支持:
通过这些步骤,FastAPI 提供了一个灵活且高效的机制来处理 HTTP 请求,同时保持了清晰和简洁的代码结构。
在 FastAPI 中,处理请求和响应头是通过以下方式实现的:
获取请求头:
Request
类。你可以将它作为路径操作函数的一个参数(使用 Depends()
装饰器)来注入一个请求对象。.headers
)来访问原始请求头字典。例如,要获取名为 “User-Agent” 的请求头,可以使用如下代码:request.headers.get("User-Agent")
。设置响应头:
HTTPResponse
对象。Response
类,它可以用来创建带有自定义头部的 HTTP 响应。Response
类接受两个主要参数:要返回的数据和一组头部关键字参数。from fastapi.responses import Response
def my_endpoint():
data = {"message": "Hello, world!"}
headers = {"Cache-Control": "max-age=60"}
return Response(content=data, media_type="application/json", headers=headers)
自动转换类型:
Header
的参数时,FastAPI 会自动从请求头中提取该字段,并将其转换为你指定的类型。from fastapi import Header
def my_endpoint(x_token: str = Header(...)):
# 使用 x_token 变量...
pass
验证和转换:
from pydantic import BaseModel
from fastapi import Header
class ContentType(BaseModel):
value: constr(regex=r"^application/json$")
def my_endpoint(content_type: ContentType = Header(...)):
# 使用 content_type.value 变量...
pass
总之,FastAPI 提供了一种直观的方式来处理请求和响应头。开发者可以直接访问请求头、添加自定义响应头,并利用类型提示和模型验证来确保数据的正确性。
在 FastAPI 中,处理文件上传是通过 UploadFile
类实现的。以下是使用 FastAPI 处理文件上传的基本步骤:
导入所需模块:
from fastapi import File, UploadFile
定义路径操作函数:
UploadFile
的参数。这个参数将用来接收上传的文件。@app.post("/upload-file/")
async def upload_file(file: UploadFile):
...
读取文件内容:
UploadFile
对象的 .file
属性来获取文件对象(通常是 SpooledTemporaryFile 或 BytesIO)。.read()
方法可以读取文件内容。请注意,这会消耗内存,因此对于大文件,你可能需要分块读取或使用其他策略。file_content = await file.read()
保存到本地文件系统:
open()
来创建一个新的文件,并使用 write()
函数将文件内容写入新文件。with open("new_filename.txt", "wb") as new_file:
new_file.write(file_content)
清理资源:
UploadFile
对象的 .close()
方法。await file.close()
错误处理:
返回响应:
除了以上基本步骤外,FastAPI 还允许你设置文件上传的限制,如最大大小、允许的文件类型等。这些配置可以通过使用 File
类型的额外参数进行指定。此外,还可以结合使用 Pydantic 模型对上传的文件进行验证。
总的来说,FastAPI 提供了一个直观且功能丰富的机制来处理文件上传,使开发者能够轻松地构建支持文件上传的 Web 应用程序。
在 FastAPI 中,处理会话(Session)和 Cookies 是通过 Starlette 库提供的功能实现的。以下是 FastAPI 处理 Session 和 Cookies 的简要概述:
Cookies:
Response
类的 .set_cookie()
方法来设置一个或多个 Cookies。这个方法接受 cookie 名称、值和其他可选参数,如过期时间、路径等。from fastapi import Response
@app.get("/cookie/")
async def set_cookie(response: Response):
response.set_cookie(key="my_cookie", value="the_value")
读取请求中的 Cookies:
Request
对象的 .cookies
属性提供。你可以在路径操作函数中访问此属性来读取请求中的 Cookies。from fastapi import Request
@app.get("/read-cookie/")
async def read_cookie(request: Request):
my_cookie = request.cookies.get("my_cookie")
...
Session:
itsdangerous
或 secure-cookie-session
来实现会话管理。JWT:
PyJWT
来实现 JWT 验证和授权。JWT 可以用于无状态的会话管理,在每个请求中携带令牌并在服务器端验证它。安全提示:
总之,FastAPI 提供了基本的 Cookie 设置和读取功能,而对于更复杂的会话管理,需要开发者结合外部库进行实现。
在 FastAPI 中,处理 HTTP 重定向是通过 RedirectResponse
类实现的。以下是使用 FastAPI 处理 HTTP 重定向的基本步骤:
导入所需模块:
from fastapi import RedirectResponse
创建重定向响应:
RedirectResponse
对象,并将你要重定向到的 URL 作为参数传递给它。@app.get("/redirect-me/")
async def redirect_me():
url = "https://example.com/new-location"
return RedirectResponse(url)
设置状态码(可选):
RedirectResponse
使用 HTTP 状态码 307 (Temporary Redirect)。如果你想使用其他状态码(如 301, 302),可以通过在创建 RedirectResponse
时提供额外的 status_code
参数来指定。return RedirectResponse(url, status_code=status.HTTP_301_MOVED_PERMANENTLY)
添加额外头部信息(可选):
RedirectResponse
构造函数。headers = {"X-Custom-Header": "Some value"}
return RedirectResponse(url, headers=headers)
返回响应:
RedirectResponse
时,FastAPI 将自动发送适当的 HTTP 响应给客户端,指示他们重新定位到新的 URL。请注意,如果需要处理多个重定向或更复杂的逻辑,可能需要编写自定义中间件或扩展 FastAPI 的默认行为。另外,为了确保安全性和用户体验,应该谨慎使用重定向,并遵循最佳实践,例如避免无限循环、保护敏感数据等。
在 FastAPI 中,处理异常和错误是通过使用装饰器和定义自定义异常类实现的。以下是 FastAPI 处理异常和错误的基本步骤:
创建自定义异常类:
Exception
的自定义异常类。class MyCustomError(Exception):
pass
抛出异常:
ValueError
),也可以是你自己定义的异常类。@app.get("/my-endpoint/")
async def my_endpoint():
if some_condition:
raise MyCustomError("This is a custom error")
...
全局异常处理:
@app.exception_handler()
装饰器来定义全局异常处理器。这个装饰器接受一个异常类作为参数,并返回一个处理该异常的函数。在这个函数内部,你可以决定如何响应给客户端。@app.exception_handler(MyCustomError)
async def handle_my_custom_error(request: Request, exc: MyCustomError):
return JSONResponse(
status_code=status.HTTP_400_BAD_REQUEST,
content={"error": str(exc)},
)
路由级别的异常处理:
FastAPI.include_router()
函数的 exception_handlers
参数。这个参数应该是一个字典,其中键是异常类,值是处理这些异常的函数。router = APIRouter()
@router.get("/my-route/")
async def my_route():
...
@router.exception_handler(MyCustomError)
async def handle_my_custom_error_for_this_route(request: Request, exc: MyCustomError):
...
app.include_router(router, exception_handlers={MyCustomError: handle_my_custom_error_for_this_route})
标准 HTTP 异常:
HTTPException
。你可以直接使用这些异常类来快速引发标准的 HTTP 错误。from fastapi import HTTPException
@app.get("/standard-error/")
async def standard_error():
raise HTTPException(status_code=404, detail="Not found")
其他异常处理:
try/except
块)来捕获并处理异常。总之,FastAPI 提供了一个灵活且可扩展的异常处理系统,允许开发者轻松地定制错误处理逻辑,以满足应用程序的需求。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。