render_template HTML отображает, но переменные не оцениваются - PullRequest
2 голосов
/ 03 июня 2019

Я пытаюсь создать версию приложения для колб "корпоративного уровня", поэтому использую чертежи и причудливую структуру каталогов.У меня есть «игрушечная» версия этого приложения, где все находится в очень плоской структуре каталогов без чертежей, и это работает.

У меня есть программа маршрутизации, которая вычисляет некоторые переменные, а затем передает их в render_template для генерации html.HTML отображается в браузере, но все переменные установлены на NONE.

Мое приложение использует чертежи и SQLite3.

Я пробовал несколько вещей, чтобы изолировать ошибку.

  1. Внесите текстовое изменение в HTML-шаблон, чтобы обеспечитьправильный шаблон подбирается.Это.

  2. Передать тривиальную строковую переменную в шаблон html и посмотреть, не появятся ли они.

  3. Просмотреть источник визуализацииhtml, none , где имена переменных фляги {{x}} присутствуют в html-шаблоне, включая сам текст {{x}}.Похоже, что значение None было использовано.

  4. Протестируйте код, ведущий к 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-шаблон, переданные переменные недоступны для «движка фляги», который указывает куда-то еще.

Ничего не происходит и нет сообщений об ошибках.

Что я делаю не так?

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