Ошибки Frozen-Flask при запуске cProfile

#python #flask #cprofile #flask-frozen

#python #flask #cprofile #flask-замороженный

Вопрос:

Создание моего статического сайта (который использует Flask-Frozen для замораживания приложения Flask) работает нормально, но когда я попытался его профилировать python -m cProfile athena.py , я получаю сообщение об ошибке

Ошибка разрешения: [Ошибка 13] Отказано в разрешении: ‘/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/build

ie Frozen-Flask пытается создать свою папку сборки в домашней папке python в моей системе, а не в моем текущем рабочем каталоге. (Несмотря на то, что я использую venv! which python выдает /path/to/dir/bin/python .)

Я смог обойти это, создав экземпляр моего приложения Flask с жестко заданным корневым путем:

 athena = Flask(__name__, root_path='/path/to/dir')
 

Но затем я получаю эту ошибку:

Предупреждение missingurlgenerator: ничего не заморожено для страницы конечных точек, hardpagelink. Вы забыли генератор URL-адресов?

Пытаясь сузить проблему с помощью отладчика, я вижу, что pages при профилировании выдается пустой список и список страниц в обычном режиме, что заставляет меня подозревать, что индекс не генерируется или генерируется где-то в другом месте.

Кроме того, есть некоторые различия в моем config (который только что сгенерирован из __name__ ):

Конфигурация профилирования: ‘DEBUG’: False, ‘FLATPAGES_AUTO_RELOAD’: ‘если отлаживать’, ‘FLATPAGES_EXTENSION’: ‘.html’

Обычная конфигурация: ‘DEBUG’: True, ‘FLATPAGES_AUTO_RELOAD’: True, ‘FLATPAGES_EXTENSION’: ‘.md’, ‘FREEZER_BASE_URL’: ‘http://localhost /’, ‘FREEZER_REMOVE_EXTRA_FILES’: False

Вот суть моего кода (полный код здесь):

 from flask import Flask, render_template
from flask_flatpages import FlatPages
from flask_frozen import Freezer
from flask_static_compress import FlaskStaticCompress

DEBUG = True
FLATPAGES_AUTO_RELOAD = DEBUG
FLATPAGES_EXTENSION = ".md"
FREEZER_REMOVE_EXTRA_FILES = False
FREEZER_BASE_URL = "http://localhost/"

athena = Flask(__name__)
athena.config.from_object(__name__)
pages = FlatPages(athena)
freezer = Freezer(athena)

@athena.route("/")
def index():
    posts = [page for page in pages if "ispage" not in page.meta]
    hpages = [page for page in pages if "ispage" in page.meta]
    return render_template(
        "index.html", pages=posts, hpages=hpages)


@athena.route("/<path:path>/")
def hardpagelink(path):
    hpage = ""
    for page in pages:
        if page.path == path:
            if page.meta["ispage"]:
                hpage = page
    hpages = [page for page in pages if "ispage" in page.meta]
    return render_template("hard.html", page=hpage, hpages=hpages)


@athena.route("/posts/<path:path>/")
def page(path):
    page = pages.get_or_404(path)
    hpages = [page for page in pages if "ispage" in page.meta]
    return render_template("page.html", page=page, hpages=hpages)


if __name__ == "__main__":
    freezer.freeze()
 

Если кто-то хочет воспроизвести это, вот инструкции по настройке env:

 git clone https://github.com/lordgrenville/athena.git
cd athena/
brew install jez/formulae/pandoc-sidenote
# or cabal install pandoc-sidenote
npm install -g less
python3 -m venv blogenv/ amp;amp; source blogenv/bin/activate
pip install werkzeug pypandoc virtualenv flask-flatpages frozen-flask pandoc-crossref flask-static-compress feedgen
python athena.py build
python -m cProfile athena.py build  # fails
 

Комментарии:

1. Вы пробовали устанавливать параметр FREEZER_DESTINATION при создании экземпляра Freezer?

2. Хм, так что установка этого (с freezer.app.config['FREEZER_DESTINATION'] = os.getcwd() ) позволяет мне избежать этой ошибки, но затем я получаю jinja2.exceptions.TemplateNotFound: index.html , подразумевая, что он перемещается в неправильный каталог в другой точке (поскольку index.html в рабочем каталоге есть)