Fastapi 请求结束后删除临时文件

在使用 Fastapi 构建文件下载接口时,遇到临时文件删除问题。由于 Fastapi 的异步处理,直接删除文件会导致文件在请求结束后被清理。本文介绍了通过 Starlette 背景任务在请求完成后优雅地删除临时 ZIP 文件的方法,避免了维护定时器的复杂性。
摘要由CSDN通过智能技术生成

背景

最近要用 Fastapi 框架简单实现一个文件下载接口,需要临时创建一个目录,将需要下载的文件打包为 zip 文件,返回给前端后,需要把这个 zip 文件删除。一开始我想到了两个思路:1. 维护一个定时器,定时去删除。2. 创建临时文件夹,接口返回后自动清理掉这个文件夹。

对比当然选择第二个方案,因为实现比较简单。

简单 demo 实现如下:

import os
import tempfile
import zipfile

import uvicorn
from fastapi import FastAPI
from fastapi.responses import FileResponse

app = FastAPI()


@app.get("/file/download")
async def file_download():
    base_dir = os.path.dirname(__file__)

    # Create temp dir
    tmp_dir_obj = tempfile.TemporaryDirectory(dir=base_dir)
    tmp_dirname = tmp_dir_obj.name

    
Python中,FastAPI是一个快速(高性能)的Web框架,它基于Python 3.7+的类型提示和异步支持。FastAPI提供了一种简单而强大的方式来处理HTTP请求拦截。 要实现请求拦截,你可以使用FastAPI提供的Depends装饰器和Request对象。Depends装饰器用于定义一个依赖项,可以在路由处理函数中使用。而Request对象则包含了HTTP请求的所有信息。 下面是一个示例,展示了如何在FastAPI中实现请求拦截: ```python from fastapi import Depends, FastAPI, HTTPException from fastapi.requests import Request app = FastAPI() # 定义一个请求拦截器 async def intercept_request(request: Request): # 在这里可以对请求进行拦截和处理 # 例如,你可以检查请求头、验证用户身份等 # 如果需要拒绝请求,可以抛出HTTPException异常 # 如果需要修改请求,可以修改request对象的属性 # 这里只是一个示例,你可以根据自己的需求进行处理 if "Authorization" not in request.headers: raise HTTPException(status_code=401, detail="Missing authorization header") return request # 定义一个路由处理函数,使用intercept_request作为依赖项 @app.get("/items/") async def read_items(request: Request = Depends(intercept_request)): # 在这里可以处理请求 # 例如,你可以从request对象中获取请求参数、请求头等信息 # 并根据这些信息返回相应的结果 return {"message": "Items returned successfully"} ``` 在上面的示例中,我们定义了一个名为`intercept_request`的请求拦截器。这个拦截器接收一个`Request`对象作为参数,并对请求进行处理。在这个示例中,我们检查了请求头中是否包含`Authorization`字段,如果不包含则抛出了一个`HTTPException`异常。 然后,我们定义了一个路由处理函数`read_items`,并使用`Depends(intercept_request)`将`intercept_request`作为依赖项传递给这个路由处理函数。这样,在每次请求到达`/items/`路径时,都会先执行`intercept_request`函数进行请求拦截,然后再执行`read_items`函数进行路由处理。 这样,我们就实现了在FastAPI中进行请求拦截的功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值