Linux环境下Gunicorn部署Flask应用时Playwright无法下载文件
解决Flask+Playwright部署Linux后写入目录权限拒绝问题
问题核心
你遇到的PermissionError是因为运行gunicorn的进程用户没有/var/apis/tceprotocolo目录的写入权限,而sudo运行gunicorn时模块找不到是因为root环境未加载你的虚拟环境依赖。
具体解决方案
1. 修复目标目录权限
首先检查目录的所有者和权限:
ls -ld /var/apis/tceprotocolo
如果输出显示所有者是root,且其他用户无写入权限(权限位为drwxr-xr-x),执行以下操作:
方案A:将目录所有者改为gunicorn运行用户(推荐)
通常gunicorn以www-data用户运行,执行:
sudo chown -R www-data:www-data /var/apis/tceprotocolo
如果你的gunicorn是用其他用户运行的,替换成对应的用户名(比如你的登录用户)。
方案B:临时开放目录写入权限(不推荐生产环境)
如果只是测试用,可以给所有用户添加写入权限:
sudo chmod o+w /var/apis/tceprotocolo
2. 解决sudo运行gunicorn的模块缺失问题
sudo默认使用root的系统环境,不会加载你的虚拟环境依赖,所以需要指定虚拟环境的Python解释器启动gunicorn:
sudo /path/to/your/venv/bin/gunicorn3 -w 4 your_flask_app:app
把/path/to/your/venv替换成你虚拟环境的实际路径,your_flask_app替换成你的Flask应用文件名(比如app.py就写app)。
或者保留当前环境变量运行:
sudo -E bash -c "source /path/to/venv/bin/activate && gunicorn3 -w 4 your_flask_app:app"
3. 代码层面优化(可选)
在保存文件前确保目录存在并设置合理权限,同时修复原代码中的页面操作bug:
import os from datetime import datetime local_save = '/var/apis/tceprotocolo' # 确保目录存在,设置所有者可读写执行,组和其他可读执行 os.makedirs(local_save, exist_ok=True, mode=0o755) def atualiza_json_consultas(): campos = ['Situação', 'Número', 'Órgão', 'Convenente', 'CPF/CNPJ Convenente', 'Objeto', 'Ínicio', 'Fim', 'Valor Concedente', 'Val'] anoa = datetime.now().year - 4 try: with sync_playwright() as p: nav = p.chromium.launch() for ano in range(anoa, anoa+5): page = nav.new_page() temp_ano = [] page.goto(link) with page.expect_download() as download_i: try: page.locator('//html//body//div[1]//div[4]//button').click() except: page.close() page = nav.new_page() # 修复关闭页面后直接goto的错误 page.goto(link) page.locator('//html//body//div[1]//div[4]//button').click() page.locator('//html//body//div[1]//div[4]//ul//li[2]//a').click() dl = download_i.value workin_dirf = f'{local_save}/infos-({str(ano)[2:]}).html' dl.save_as(workin_dirf) page.close() nav.close() # 记得关闭浏览器实例 except Exception as e: # 添加异常捕获便于调试 print(f"Error: {str(e)}")
内容的提问来源于stack exchange,提问作者J.N.N
相关产品推荐
相关产品推荐

