我正在尝试构建Flask应用程序的“企业级”版本,因此我正在使用蓝图和精美的目录结构。我有一个此应用程序的“玩具”版本,其中所有内容都位于一个非常平坦的目录结构中,没有蓝图,并且可以正常工作。
我有一个路由程序,该程序计算一些变量,然后将它们传递给render_template
以生成html。 html显示在浏览器中,但是所有变量似乎都设置为NONE
。
我的应用程序使用蓝图和SQLite3。
我尝试了多种方法来找出错误。
对html模板进行文字更改,以确保选择正确的模板。是。
将琐碎的字符串变量传递给html模板,看看它们是否显示出来,没有。
查看呈现的html的源代码,没有什么 ,其中flask变量名称{{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 \ 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引擎”不可用。
一切正常,没有错误消息。
我在做什么错了?