You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:01:07