Litestar框架请求处理全解析:从基础到高级用法

Litestar框架请求处理全解析:从基础到高级用法

litestar Production-ready, Light, Flexible and Extensible ASGI API framework | Effortlessly Build Performant APIs litestar 项目地址: https://gitcode.com/gh_mirrors/li/litestar

请求体基础处理

在Litestar框架中,处理HTTP请求体非常简单直观。框架提供了一个特殊的data参数,可以直接在路由处理函数中使用它来获取请求体内容。

from litestar import post

@post("/")
async def handler(data: dict) -> dict:
    return {"received": data}

这种设计使得请求体处理变得异常简洁,开发者无需编写繁琐的解析代码。Litestar支持多种数据类型作为请求体:

  • Python标准库类型(如dict、list等)
  • 类型字典(TypedDict)
  • 数据类(dataclass)
  • 通过插件支持的类型(如Msgspec Struct、Pydantic模型、Attrs类等)
from dataclasses import dataclass
from litestar import post

@dataclass
class User:
    name: str
    age: int

@post("/")
async def handler(data: User) -> User:
    return data

请求体验证与OpenAPI文档定制

Litestar提供了Body类来实现对请求体的精细控制,包括验证规则和OpenAPI文档定制:

from litestar import post
from litestar.params import Body

@post("/")
async def create_user(
    data: User = Body(
        title="User Creation",
        description="Create a new user account",
        min_length=1,
        max_length=100,
    )
) -> User:
    return data

这种设计不仅增强了API的健壮性,还能自动生成详细的API文档,极大提高了开发效率。

内容类型处理

默认JSON处理

默认情况下,Litestar会将请求体解析为JSON格式。这在大多数RESTful API场景下是最常用的处理方式。

URL编码表单数据

对于application/x-www-form-urlencoded类型的内容,需要显式指定媒体类型:

from litestar import post
from litestar.enums import RequestEncodingType
from litestar.params import Body

@post("/")
async def handle_url_encoded_form(
    data: dict = Body(media_type=RequestEncodingType.URL_ENCODED)
) -> dict:
    return data

需要注意的是,URL编码数据相比JSON能力有限,不适合处理复杂嵌套结构。

多部分表单数据

处理文件上传等场景需要使用multipart/form-data类型:

from litestar import post
from litestar.enums import RequestEncodingType
from litestar.params import Body

@post("/")
async def handle_multipart_form(
    data: dict = Body(media_type=RequestEncodingType.MULTI_PART)
) -> dict:
    return data

文件上传处理

单文件上传

Litestar为文件上传提供了UploadFile类,它封装了临时文件处理,支持异步操作:

from litestar import post
from litestar.datastructures import UploadFile

@post("/")
async def handle_file_upload(data: UploadFile) -> dict:
    content = await data.read()
    return {"filename": data.filename, "size": len(content)}

对于同步处理函数,可以直接使用文件对象的read方法:

@post("/")
def handle_file_upload_sync(data: UploadFile) -> dict:
    content = data.file.read()
    return {"filename": data.filename, "size": len(content)}

多文件上传

对于多个文件上传,可以使用Pydantic模型进行结构化处理:

from pydantic import BaseModel
from litestar import post
from litestar.datastructures import UploadFile

class FileUploadModel(BaseModel):
    avatar: UploadFile
    resume: UploadFile

@post("/")
async def handle_multiple_files(data: FileUploadModel) -> dict:
    return {"avatar_size": len(await data.avatar.read())}

文件字典和列表形式

如果不需要严格验证,可以直接使用字典或列表接收文件:

# 字典形式
@post("/")
async def handle_files_dict(data: dict[str, UploadFile]) -> dict:
    return {name: file.filename for name, file in data.items()}

# 列表形式
@post("/")
async def handle_files_list(data: list[UploadFile]) -> dict:
    return {"count": len(data)}

MessagePack数据处理

Litestar支持MessagePack这种高效的二进制序列化格式:

from litestar import post
from litestar.enums import RequestEncodingType
from litestar.params import Body

@post("/")
async def handle_msgpack(data: dict = Body(media_type=RequestEncodingType.MESSAGEPACK)) -> dict:
    return data

自定义请求类

从2.7.0版本开始,Litestar支持自定义请求类,可以在应用级别进行配置:

from litestar import Litestar, Request, get
from litestar.connection import ASGIConnection

class CustomRequest(Request):
    @property
    def is_authenticated(self) -> bool:
        return "user_id" in self.session

@get("/")
async def handler(request: CustomRequest) -> dict:
    return {"is_authenticated": request.is_authenticated}

app = Litestar(route_handlers=[handler], request_class=CustomRequest)

这种设计遵循Litestar的分层架构理念,可以在不同层级(应用、路由等)设置不同的请求类,最接近路由处理程序的层具有最高优先级。

请求体大小限制

Litestar默认限制请求体大小为10MB,超过此限制会返回413错误。可以通过request_max_body_size参数调整:

from litestar import Litestar, post

# 全局设置
app = Litestar(route_handlers=[...], request_max_body_size=1024 * 1024 * 20)  # 20MB

# 针对特定路由取消限制(慎用)
@post("/large-upload", request_max_body_size=None)
async def handle_large_upload(data: bytes) -> dict:
    return {"size": len(data)}

需要注意的是,取消限制可能存在安全风险,建议仅在受控环境中使用,如配合反向代理的请求大小限制。

最佳实践建议

  1. 对于简单API,直接使用JSON格式和基本数据类型即可
  2. 文件上传场景优先使用UploadFile类,它提供了良好的内存管理
  3. 生产环境中务必设置合理的请求体大小限制
  4. 充分利用Body类的验证和文档功能提升API质量
  5. 自定义请求类时注意保持与框架其他部分的兼容性

通过本文的全面介绍,开发者应该能够掌握Litestar框架中各种请求处理场景的最佳实践,构建出既安全又高效的Web应用程序。

litestar Production-ready, Light, Flexible and Extensible ASGI API framework | Effortlessly Build Performant APIs litestar 项目地址: https://gitcode.com/gh_mirrors/li/litestar

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常拓季Jane

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值