Flask不会从使用pyInstaller创建的exe服务器处理静态html文件

时间:2019-06-23 23:05:50

标签: python flask pyinstaller

我是python的新手,我的文件夹结构如下

|-main.py
|-client
|----index.html
|----scripts

我已经创建了flask应用程序,并将static_folder设置为客户端。

app = Flask(__name__, static_url_path="", static_folder='client')

下面是路线

@app.route('/')
def index():
    print("static folder " + app.static_folder)
    return app.send_static_file("index.html")

当我正常运行我的应用程序时,它将运行并提供index.html和所有脚本。

我已经使用pyinstaller创建了exe。当我运行exe时,它将启动服务器,但它不提供index.html。打印语句在控制台上写为“静态文件夹C:\ 8088 \ client”。 8080是我放置了exe并从此处运行的文件夹。如果我手动将客户端文件夹复制到8080目录中,则它将起作用。我希望从exe内部提供HTML,因为我不想公开这些文件。

使用pyinstxtractor.py,我已经提取并检查了提取文件中是否存在客户端文件夹。

我想念什么吗?

2 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

  1. 您不应使用静态文件来提供HTML文件,因此需要使用Templates。用于提供用户文件等静态文件的静态文件。

  2. 当您要冻结应用程序时,应注意两件事。首先,您需要使用Pyinstaller将文件添加为数据文件,以将其提取到应用程序每次运行的temp目录中。

    第二,应该从temp目录中提取的文件中正确加载文件。

假设此项目树:

│app.py
│
├───client
│       file.txt
│
└───templates
        index.html

接下来,app.py应该如下所示:

from flask import Flask, render_template
import os
import sys


def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)


app = Flask(__name__, static_url_path="", static_folder=resource_path(
    'client'), template_folder=resource_path("templates"))


@app.route('/static')
def files():
    return app.send_static_file("file.txt")


@app.route('/')
def index():
    return render_template("index.html")


if __name__ == "__main__":
    app.run(debug=True)

最后,您可以使用以下命令生成可执行文件,并在add-data上进行记录:

pyinstaller app.py -F --add-data "./templates/*;templates" --add-data "./client/*;client"

答案 1 :(得分:0)

默认情况下,flask应用将在根文件夹中查找模板目录。 也有可能覆盖Jinja加载程序并设置Jinja查找模板的路径。喜欢:

my_loader = jinja2.ChoiceLoader([
    app.jinja_loader,
    jinja2.FileSystemLoader(['/flaskapp/userdata', 
                             '/flaskapp/templates']),
])
app.jinja_loader = my_loader

按照Jinja首先需要查找的顺序排列目录。然后,从视图中,可以呈现如下用户特定模板:

render_template('%s/template1/hello.html' % username)