我是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,我已经提取并检查了提取文件中是否存在客户端文件夹。
我想念什么吗?
答案 0 :(得分:0)
您的代码存在一些问题:
您不应使用静态文件来提供HTML文件,因此需要使用Templates。用于提供用户文件等静态文件的静态文件。
当您要冻结应用程序时,应注意两件事。首先,您需要使用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)