Flask не сервер статический HTML-файл из EXE-файла, созданного с помощью pyInstaller - PullRequest
0 голосов
/ 24 июня 2019

Я новичок в Python, у меня есть структура папок, как показано ниже

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

Я создал приложение фляги и установил 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 и все сценарии.

Я создал exe с помощью pyinstaller.Когда я запускаю exe, он запускает сервер, но не обслуживает index.html.Оператор печати пишет в консоли как «статическая папка C: \ 8088 \ client».8080 - это папка, в которую я поместил exe и запускаю отсюда.Если я вручную скопирую папку клиента в каталогах 8080, то это работает.Я хочу, чтобы HTML-код обслуживался из исполняемого файла, поскольку я не хочу предоставлять эти файлы.

С помощью pyinstxtractor.py я извлек и проверил, что папка клиента существует в извлеченных файлах.

Я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

По умолчанию приложение фляги будет искать каталог шаблонов в корневой папке. Также есть возможность перезаписать загрузчик Jinja и указать пути, по которым Jinja будет искать шаблоны. Как:

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

Каталоги расположены в том порядке, в котором Джинджа должен сначала начать искать его. Затем из представления вы можете отобразить пользовательский шаблон как этот:

render_template('%s/template1/hello.html' % username)
0 голосов
/ 24 июня 2019

Есть некоторые проблемы с вашим кодом:

  1. Вы не должны использовать статические файлы для обслуживания файлов HTML, поэтому вам нужно использовать Шаблоны . Статические файлы, используемые для обслуживания статических файлов, такие как пользовательские файлы.

  2. Если вы хотите заморозить свое приложение, вы должны позаботиться о двух вещах. Во-первых, вам нужно добавить свои файлы как файлы данных с помощью Pyinstaller, чтобы извлекать их во временный каталог при каждом запуске вашего приложения.

    Во-вторых, ваши файлы должны быть правильно загружены из извлеченных файлов во временную директорию.

Предположим, это дерево проекта:

│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"
...