render_template HTML呈现但未评估变量

时间:2019-06-02 23:11:07

标签: python flask

我正在尝试构建Flask应用程序的“企业级”版本,因此我正在使用蓝图和精美的目录结构。我有一个此应用程序的“玩具”版本,其中所有内容都位于一个非常平坦的目录结构中,没有蓝图,并且可以正常工作。

我有一个路由程序,该程序计算一些变量,然后将它们传递给render_template以生成html。 html显示在浏览器中,但是所有变量似乎都设置为NONE

我的应用程序使用蓝图和SQLite3。

我尝试了多种方法来找出错误。

  1. 对html模板进行文字更改,以确保选择正确的模板。是。

  2. 将琐碎的字符串变量传递给html模板,看看它们是否显示出来,没有。

  3. 查看呈现的html的源代码,没有什么 ,其中flask变量名称{{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 \ routes.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>

为响应@Tobin的评论,我提供了(应该)注册蓝图的代码。我使用应用程序工厂。

这是app \ __ 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模板时,传递的变量对于指向其他地方的“ flask引擎”不可用。

一切正常,没有错误消息。

我在做什么错了?

0 个答案:

没有答案