Я пытаюсь создать версию приложения для колб "корпоративного уровня", поэтому использую чертежи и причудливую структуру каталогов.У меня есть «игрушечная» версия этого приложения, где все находится в очень плоской структуре каталогов без чертежей, и это работает.
У меня есть программа маршрутизации, которая вычисляет некоторые переменные, а затем передает их в render_template
для генерации html.HTML отображается в браузере, но все переменные установлены на NONE
.
Мое приложение использует чертежи и SQLite3.
Я пробовал несколько вещей, чтобы изолировать ошибку.
Внесите текстовое изменение в HTML-шаблон, чтобы обеспечитьправильный шаблон подбирается.Это.
Передать тривиальную строковую переменную в шаблон html и посмотреть, не появятся ли они.
Просмотреть источник визуализацииhtml, none , где имена переменных фляги {{x}} присутствуют в html-шаблоне, включая сам текст {{x}}.Похоже, что значение None было использовано.
Протестируйте код, ведущий к render_template
, он отлично работает.
Моя структура каталогов: -
\myapp
app.py
\app
__init__.py
\main
__init__.py
routes.py
...
\meta
__init__.py
routes.py
...
\templates
...
base.html
index.html
Код в \ meta \ rout.py (который соответствует метапроекту) работает вплоть до entitys = stmt.fetchall()
и включает: -
from flask import Flask, render_template, request
import sqlite3 as sql
from app.meta import bp
from app import Config
config = Config()
metafile = os.path.join(config.META_DIR, config.META_MS, config.META_DB)
@bp.route('/', methods=['GET', 'POST'])
@bp.route('/index', methods=['GET', 'POST'])
def index():
meta = sql.connect(metafile)
stmt = meta.cursor()
stmt.execute("SELECT * FROM [meta.Entity]")
entitys = stmt.fetchall()
return render_template("index.html", entitys = entitys)
В случае, если это уместно, здесь \ meta \ __ init__.py: -
from flask import Blueprint
bp = Blueprint('meta', __name__)
Шаблон html выглядит следующим образом.Base.html: -
<!doctype html>
<html>
<head>
{% if title %}
<title>{{ title }} - Metapplica</title>
{% else %}
<title>Metapplica</title>
{% endif %}
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="{{ url_for('static', filename = 'w3.css') }}">
<link rel="stylesheet" href="{{ url_for('static', filename = 'style.css') }}">
</head>
<body>
<div>
<a href="{{ url_for('main.index') }}">Home</a>
</div>
<hr>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</body>
</html>
, а index.html: -
{% extends "base.html" %}
{% block content %}
<h2>Entities</h2>
<table border = 1>
<thead>
<td>Entity</td>
<td>Action</td>
</thead>
{% for entity in entitys %}
<tr>
<td>{{ entity["Name"] }}</td>
<td>
<a href="{{url_for("entity_list", entity=entity["EntityId"])}}">List</a>
<a href="{{url_for("entity_add", entity=entity["EntityId"])}}">Add</a>
</td>
</tr>
{% endfor %}
</table>
{% endblock %}
Наконец, рендеринг HTML выглядит так: -
<!doctype html>
<html>
<head>
<title>Home - Metapplica</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/w3.css">
<link rel="stylesheet" href="/static/style.css">
</head>
<body>
<div>
<a href="/index">Home</a>
</div>
<hr>
<h2>Entities </h2>
<table border = 1>
<thead>
<td>Entity</td>
<td>Action</td>
</thead>
</table>
</body>
</html>
InОтвет на комментарий @ Тобина Я включил код, который (должен) регистрировать проект.Я использую фабрику приложений.
Вот приложение \ __ init __ ()
import logging
from logging.handlers import SMTPHandler, RotatingFileHandler
import os
from flask import Flask, session, redirect, url_for, escape, request, current_app
from config import Config
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
# Register blueprints
from app.errors import bp as errors_bp
app.register_blueprint(errors_bp, url_prefix='/err')
from app.auth import bp as auth_bp
app.register_blueprint(auth_bp, url_prefix='/auth')
from app.meta import bp as meta_bp
app.register_blueprint(meta_bp, url_prefix='/meta')
from app.main import bp as main_bp
app.register_blueprint(main_bp)
return app
, а вот код, который его вызывает: -
from app import create_app
app = create_app()
Я подозреваю, чтокаким-то образом, когда Flask отображает html-шаблон, переданные переменные недоступны для «движка фляги», который указывает куда-то еще.
Ничего не происходит и нет сообщений об ошибках.
Что я делаю не так?