render_template () не может найти шаблон, расположенный в папке проекта - PullRequest
0 голосов
/ 11 марта 2020

Следующее является частью моей настройки в приложении flask, использующем Flask -Blueprints, где reports - это чертеж:

app
├── __init__.py
└── /reports
    ├── /templates
    │   └── /reports
    │       └── reports.html
    ├── __init__.py
    └── views.py

Это мой app/reports/__init.py:

from flask import Blueprint

reports_bp = Blueprint('reports', __name__)

from app.reports import views

И вот как я регистрирую план отчетов в app/__init__.py (обратите внимание, особенно, как я указываю расположение папки моего шаблона как 'templates'):

...
from app.reports import reports_bp
app.register_blueprint(reports_bp, url_prefix='/reports',  template_folder='templates')
...

Наконец я в app/reports/views.py есть функция вида, которая выглядит примерно так:

@reports_bp.route('/')
def reports():

    ...

    return render_template('reports/reports.html', ...)

render_template однако не находит мой шаблон reports.html, и когда я включаю переменную EXPLAIN_TEMPLATE_LOADING config, я получаю это обратная связь:

[2020-03-11 14:40:21,966] INFO in debughelpers: Locating template "reports/reports.html":
    1: trying loader of application "app"
       class: jinja2.loaders.FileSystemLoader
       encoding: 'utf-8'
       followlinks: False
       searchpath:
         - /path_to_my_app/app/templates
       -> no match
    2: trying loader of blueprint "restplus_doc" (flask_restplus.apidoc)
       class: jinja2.loaders.FileSystemLoader
       encoding: 'utf-8'
       followlinks: False
       searchpath:
         - /path_to_my_app/my_virtualenv/lib/python3.7/site-packages/flask_restplus/templates
       -> no match
Error: the template could not be found.
  The template was looked up from an endpoint that belongs to the blueprint "reports".
  Maybe you did not place a template in the right folder?
  See http://flask.pocoo.org/docs/blueprints/#templates

Ожидается первый путь поиска, но , почему второй путь поиска находится в папке пакета сайта внутри моего virtualenv, к которому бесполезно прикреплен постфикс /templates? Не должен ли второй путь поиска быть папкой с чертежами reports?

Я использую VS Code и запускаю его в режиме отладчика. Моя установленная Flask - это версия 1.0.2.

РЕДАКТИРОВАТЬ: изменение template_folder при регистрации чертежа на что-то другое, например 'reports/templates', не меняет путь поиска номер 2. Что дает мне подсказку, что какой-то другой проект запугивает мой проект и контролирует, где выполняется render_template.

EDIT 2: Реальная проблема заключалась в том, что для моего проекта не был создан загрузчик. Номер загрузчика. 2 относится к другой схеме, о которой я не знал при публикации вопроса и не имеет отношения к моей проблеме. См. Опубликованный ответ для более подробной информации.

1 Ответ

0 голосов
/ 12 марта 2020

Очевидно, что бит template_folder='templates' должен быть включен в качестве параметра, когда проект инициализируется, а не когда он регистрируется, как я делал.

Так что теперь я инициализирую проект следующим образом: app/reports/__init.py:

from flask import Blueprint

reports_bp = Blueprint('reports', __name__, template_folder='templates')

from app.reports import views

и мне больше не нужно указывать что-либо о папке шаблона при регистрации чертежа, см. Мой обновленный бит кода из app/__init__.py:

...
from app.reports import reports_bp
app.register_blueprint(reports_bp, url_prefix='/reports')
...

Просто чтобы показать, что теперь был добавлен новый загрузчик jinja, теперь он печатается при отображении шаблона:

[2020-03-12 13:19:54,870] INFO in debughelpers: Locating template "reports/reports.html":
    1: trying loader of application "app"
       class: jinja2.loaders.FileSystemLoader
       encoding: 'utf-8'
       followlinks: False
       searchpath:
         - /path_to_my_app/app/templates
       -> no match
    2: trying loader of blueprint "restplus_doc" (flask_restplus.apidoc)
       class: jinja2.loaders.FileSystemLoader
       encoding: 'utf-8'
       followlinks: False
       searchpath:
         - /path_to_my_app/ankappenv3/lib/python3.7/site-packages/flask_restplus/templates
       -> no match
    3: trying loader of blueprint "reports" (app.reports)
       class: jinja2.loaders.FileSystemLoader
       encoding: 'utf-8'
       followlinks: False
       searchpath:
         - /path_to_my_app/app/reports/templates
       -> found ('/path_to_my_app/app/reports/templates/reports/reports.html')

Здесь вы можете видеть, что был добавлен третий загрузчик, и который ищет /app/reports/templates/ указан правильный путь, где он находит шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...