【问题标题】:Flask Blueprints: How to use them?烧瓶蓝图:如何使用它们?
【发布时间】:2015-08-31 11:50:20
【问题描述】:

我对如何在烧瓶中使用蓝图有点困惑。让我告诉你我想做什么:

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

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 时,application/landing/templates/index.html 页面(和相应的标志)被加载。

这应该不难,但我不知为何感到困惑。

感谢任何帮助!

编辑

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

    $.backstretch([
        "{{ url_for('landing.static' , filename='img/bg/01.jpg') }}", 
        "{{ url_for('landing.static' , filename='img/bg/02.jpg') }}",
        "{{ url_for('landing.static' , filename='img/bg/03.jpg') }}"
    ], {duration: 3000, fade: 750});

    127.0.0.1 - - [31/Aug/2015 16:47:42] "GET /%7B%7B%20url_for('landing.static'%20,%20filename='img/bg/01.jpg')%20%7D%7D HTTP/1.1" 404 -
    127.0.0.1 - - [31/Aug/2015 16:47:42] "GET /%7B%7B%20url_for('landing.static'%20,%20filename='img/bg/02.jpg')%20%7D%7D HTTP/1.1" 404 -
    127.0.0.1 - - [31/Aug/2015 16:47:42] "GET /%7B%7B%20url_for('landing.static'%20,%20filename='img/bg/03.jpg')%20%7D%7D HTTP/1.1" 404 -

【问题讨论】:

标签: flask


【解决方案1】:

以下文件应该可以帮助您实现您想要的:

运行.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')

应用程序/登陆/init.py

​​>
from flask import Blueprint

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

from application.landing import views

application/admin/init.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')

application/admin/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 文件。

【讨论】:

  • 嗨,感谢您的回答(我会将您的回答标记为正确 - 尽管我已经根据提供的链接解决了它)。但是,我看不到如何在 javascript 中使用 blueprints/jinja2。你能给我一些帮助吗?查看我的编辑。
  • 这取决于您提供 JS 文件的方式:如果它们是静态 JS 文件(即在交付之前未呈现),您应该使用绝对 URL(例如 /landing/static/img/bg/01.jpg - 注意前面的 @987654342 @)。否则,添加逻辑来预处理您的 JS 脚本以呈现它们包含的 Jinja2 标记(并在您的 JS 文件中使用 {{ url_for() }} 函数),方法是通过专用端点为它们提供服务。我认为两者都是有效的方法,但我更喜欢第一个。
  • 我更喜欢url_for 解决方案,但同样,它看起来不起作用......我已经用调试器的输出更新了我的编辑。如果您不介意,请看一下。
  • 正如我所说,您需要创建一个专用端点来为您的 JS 文件提供服务,就好像它们是(因为它们毕竟在这里)模板:创建一个 /application/landing/templates/landing/js 文件夹,放置您的 JS文件在其中(例如index.js)并创建一个端点以在提供JS之前渲染JS(在/application/landing/views.py中):@landing.route('/js/') def get_rendered_js(filename): return render_template ('landing/js/{filename}'.format(filename=filename)) 然后,将您的 JS 文件引用为 /landing/js/index.js
  • 抱歉,要明确一点:我已经让它工作了(就在你回答之前)。换句话说,我在 html 文件(模板)中广泛使用了{{ url_for() }},但我不能在 javascript 文件中使用它(如您在上面的调试输出中看到的那样)。所以,现在,我的问题非常具体。它与蓝图无关(通常)。有什么想法吗?
猜你喜欢
  • 2012-06-16
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2018-10-27
  • 2015-07-16
  • 1970-01-01
相关资源
最近更新 更多