Flask应用zip文件设置htpasswd保护及过期文件清理相关问题咨询
Flask应用结果文件加密、邮件发送与过期清理解决方案
1. 为zip文件配置htpasswd访问保护
htpasswd是HTTP基础认证的账户密码存储方案,不需要对单个zip单独加密,对存储zip的文件夹统一做访问控制即可,两种常用实现路径:
- 生产环境推荐用Nginx/Apache反向代理层配置:
- 首先执行命令生成密码文件:
htpasswd -c /<自定义存储路径>/.htpasswd <任务专属用户名>,按提示输入对应密码即可,可按需为每个任务生成独立的认证信息 - Nginx站点配置中添加如下规则,实现静态文件访问拦截:
location /download-zip/ { auth_basic "请输入访问凭证"; auth_basic_user_file /<自定义存储路径>/.htpasswd; alias /flask应用根目录/zip存储文件夹/; }
- 首先执行命令生成密码文件:
- 不想修改服务端配置的话,可直接在Flask层实现兼容htpasswd的认证:安装
flask-httpauth扩展,给下载路由加基础认证校验,用户名密码可存在数据库或本地临时文件中,效果和服务层配置完全一致。
2. 用flask-mail发送下载通知邮件
- 先安装依赖:
pip install flask-mail - 初始化flask-mail示例:
from flask_mail import Mail, Message app.config.update( MAIL_SERVER = 'smtp.你的邮箱服务商域名', MAIL_PORT = 465, MAIL_USE_SSL = True, MAIL_USERNAME = '你的发件邮箱地址', MAIL_PASSWORD = '你的邮箱授权码' ) mail = Mail(app)
- 发送通知逻辑:生成zip文件时将对应的下载链接、认证用户名、密码和任务绑定存入数据库,发送时直接取出拼接邮件内容即可:
def send_download_notice(user_email, download_url, auth_user, auth_pwd): msg = Message( subject = '任务处理完成,结果可下载', sender = app.config['MAIL_USERNAME'], recipients = [user_email] ) msg.body = f""" 你的任务已处理完成,下载信息如下: 下载地址:{download_url} 访问用户名:{auth_user} 访问密码:{auth_pwd} 链接将在N周后自动失效,请及时保存文件。 """ mail.send(msg)
3. 过期zip文件清理逻辑
你提出的「新任务提交时批量清理过期文件」的方案是可行的,实现成本很低:
- 存储zip文件时,建议将创建时间编码到文件名(如
result_<任务ID>_<13位时间戳>.zip),或者在数据库中记录每个zip的存储路径、创建时间、过期时间 - 每次新任务提交触发时,遍历zip存储文件夹或者查询数据库中的任务列表,筛选出创建时间超过设定阈值(比如2周)的文件,调用
os.remove(文件路径)删除即可,同步将对应任务标记为已过期 - 如果担心任务提交频率低导致清理不及时,可引入
APScheduler设置定时任务,每周固定时间执行一次全量清理,不依赖任务提交触发。
内容的提问来源于stack exchange,提问作者honeymoon
相关产品推荐
相关产品推荐

