烧瓶蓝图:如何使用它们?

时间:2015-08-31 11:50:21

标签: flask

我对如何利用烧瓶中的蓝图感到困惑。让我告诉你我想做什么:

首先,我的项目必须具有以下结构:

run.py
application
-- __init.py__
-- admin
-- -- templates
-- -- -- index.html
-- -- static
-- -- -- img
-- -- -- -- logo.png
-- -- models.py 
-- -- views.py 
-- landing
-- -- templates
-- -- -- index.html
-- -- static
-- -- -- img
-- -- -- -- logo.png
-- -- models.py 
-- -- views.py 

我想要做的是定义两个蓝图,以便在我访问/admin application/admin/templates/index.html页面(和相应的徽标)时加载,但是当我访问/landing时<{1}}页面(以及相应的徽标)已加载。

这应该不是那么困难但我出于某种原因感到困惑。

感谢任何帮助!

修改

更具体地说,以下蓝图和jinja2的使用是否有意义?它似乎没有按预期工作......

application/landing/templates/index.html

1 个答案:

答案 0 :(得分:5)

以下文件可以帮助您实现目标:

run.py

from application.admin import admin
from application.landing import landing

from flask import Flask
app = Flask(__name__)

# Register the blueprints
app.register_blueprint(admin)
app.register_blueprint(landing)

app.debug = True

print app.url_map

app.run(host='0.0.0.0')

应用/降落/的初始化的.py

from flask import Blueprint

landing = Blueprint('landing', __name__, template_folder='templates', url_prefix='/landing', static_folder='static')

from application.landing import views

应用/管理/的初始化的.py

from flask import Blueprint

admin = Blueprint('admin', __name__, template_folder='templates', url_prefix='/admin', static_folder='static')

from application.admin import views

应用/降落/ views.py

from application.landing import landing

from flask import render_template


@landing.route('/')
def get_landing_index():
    return render_template('landing/index.html')

应用/管理/ views.py

from application.admin import admin

from flask import render_template


@admin.route('/')
def get_admin_index():
    return render_template('admin/index.html')

您应该获得以下路线:

<Rule '/landing/' (HEAD, OPTIONS, GET) -> landing.get_landing_index>,
<Rule '/admin/' (HEAD, OPTIONS, GET) -> admin.get_admin_index>,
<Rule '/landing/static/<filename>' (HEAD, OPTIONS, GET) -> landing.static>,
<Rule '/admin/static/<filename>' (HEAD, OPTIONS, GET) -> admin.static>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]

但请注意,您必须更改存储模板的路径。模板位于:

  • /application/landing/templates/landing/index.html
  • /application/admin/templates/admin/index.html

重复模板文件夹中的蓝图名称可以缓解here中描述的错误/功能。如果模板共享相同的名称(例如index.html),即使它们位于不同的蓝图中,其中一个也始终优先。有关上述链接的更多信息。

有关如何在与蓝图一起使用时链接模板中的静态文件的信息,/application/admin/templates/admin/index.html可能如下所示:

<!DOCTYPE html>
<html>
<head>
    <title>Admin page</title>
</head>
<body>
<h1>Welcome to Admin</h1>
<img src="{{ url_for('admin.static', filename='cat.jpg') }}"/>
</body>
</html>

文件cat.jpg将在/application/admin/static/cat.jpg中提供。对于landing,模板/application/landing/templates/landing/index.html可以采用相同的方式制作:

<!DOCTYPE html>
<html>
<head>
    <title>Landing page</title>
</head>
<body>
<h1>Welcome to Landing</h1>
<img src="{{ url_for('landing.static', filename='cat.jpg') }}"/>
</body>
</html>

文件cat.jpg将存储在/application/landing/static/cat.jpg中。无需重复/static/下方的蓝图名称,因为url_for()已将其作为参数。

最后,不要忘记在需要的地方添加__init__.py个文件。