#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
в рабочем каталоге есть)