使用pyinstaller时如何为flask admin收集静态文件?

问题描述

我有一个使用flask admin 的flask 项目。

我正在使用 pyinstaller 打包它。我正在执行以下操作来创建我的 pyinstaller 脚本

mkdir ./src/static
cp -r ./venv/lib/python3.8/site-packages/flasgger/ui2/templates/. ./src/templates
cp -r ./venv/lib/python3.8/site-packages/flask_admin/templates/. ./src/templates
cp -r ./venv/lib/python3.8/site-packages/flasgger/ui2/static/. ./src/static
cp -r ./venv/lib/python3.8/site-packages/flask_admin/static/. ./src/static
pyinstaller \
    --onefile \
    --add-data "./src/templates:templates" \
    --add-data "./src/static:static" \
    --add-data "./src/swagger:swagger" \
    --paths ".:./src/:./test:./venv" \
    ./src/app.py

我的 app.py 执行以下操作

    if getattr(sys,'frozen',False):
        template_folder = os.path.join(sys._MEIPASS,'templates')
        static_folder = os.path.join(sys._MEIPASS,'static')
        app = Flask(__name__,template_folder=template_folder,static_folder=static_folder)
    else:
        app = Flask(__name__)

我看到 flasgger 视图及其静态文件可以正常运行。但是,flask_admin 静态文件没有得到提供,并且出现 404 错误

可能是什么原因?

解决方法

pyinstaller 构建应用程序时,一般都会包含实际调用的文件。

在flask_admin中,静态文件是从HTML文件中访问的,其中pyinstaller将静态文件识别为未使用的文件,并且不会将其包含在构建文件中。

在这种情况下,您不能从站点包中导入包。

你必须在你运行应用程序的地方放置flask_admin包,并从本地导入flask_admin。

例如: 考虑这个应用程序结构

project
   |--- app
         |--- __init__.py
         |--- ... (other files)
   |--- flask_admin
   |--- run.py

init.py

from flask import Flask
from flask_admin import Admin

def create_app():
    app = Flask(__name__)
    admin = Admin(app)
    ...
    ...
    return app

run.py

from app import creare_app

if __name__ == "__main__":
    app = create_app()
    app.run()

这里:

  • 不应在环境中安装flask_admin。
  • flask_admin 包应放置在您运行应用程序的位置。 (从 gi​​t 下载 flask_admin)。
  • 在使用 pyinstaller 构建应用程序时,还应添加整个 flask_admin 包。

示例命令:

pyinstaller --onedir --add-data "/dir/app;app/" --add-data "/dir/flask_admin;flask_admin/" run.py


你可以找到一个例子here