Flask-Bootstrap 是如何工作的?
How Flask-Bootstrap works?
我正在学习 Flask Web 开发,我正在学习的教程介绍了一个名为 Flask-Bootstrap 的扩展。要使用这个扩展,你必须先初始化它,像这样:
from flask_bootstrap import Bootstrap
# ...
bootstrap = Bootstrap(app)
对我来说很奇怪,变量 bootstrap
没有在我的模块的其余部分中使用。但是,如果我注释掉这一行,则会引发 jinja2.exceptions.TemplateNotFound
异常。此外,使用的模板以此行开头:
{% extends "bootstrap/base.html" %}
但是我在 /templates
!
下没有名为 /bootstrap
的目录
我想知道发生了什么:
bootstrap = Bootstrap(app)
行的作用是什么?
bootstrap/base.html
住在哪里?
正如@davidism 在他的评论中所说,bootstrap = Bootstrap(app)
行 "installs the extension on the app"。这种安装背后的机制超出了这个答案的范围。
bootstrap/base.html
位于 Flask-Bootstrap 包中。例如,在我的机器上它的绝对路径是:
/Users/sunqingyao/Documents/Projects/flasky/venv/lib/python2.7/site-packages/flask_bootstrap/templates/bootstrap/base.html
内容如下:
{% block doc -%}
<!DOCTYPE html>
<html{% block html_attribs %}{% endblock html_attribs %}>
{%- block html %}
<head>
{%- block head %}
<title>{% block title %}{{title|default}}{% endblock title %}</title>
{%- block metas %}
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{%- endblock metas %}
{%- block styles %}
<!-- Bootstrap -->
<link href="{{bootstrap_find_resource('css/bootstrap.css', cdn='bootstrap')}}" rel="stylesheet">
{%- endblock styles %}
{%- endblock head %}
</head>
<body{% block body_attribs %}{% endblock body_attribs %}>
{% block body -%}
{% block navbar %}
{%- endblock navbar %}
{% block content -%}
{%- endblock content %}
{% block scripts %}
<script src="{{bootstrap_find_resource('jquery.js', cdn='jquery')}}"></script>
<script src="{{bootstrap_find_resource('js/bootstrap.js', cdn='bootstrap')}}"></script>
{%- endblock scripts %}
{%- endblock body %}
</body>
{%- endblock html %}
</html>
{% endblock doc -%}
"how can Jinja2 find base.html
"的答案会在文档中找到相关部分后立即添加。
- 其他答案已经告诉你了
the bootstrap = Bootstrap(app) line "init the extension on the app".
The bootstrap/base.html resides in the Flask-Bootstrap package.
要理解这一点,您必须了解“Flask 的模板搜索路径”
- 应用程序的模板文件夹
- 蓝图的模板文件夹
所以Flask-Bootstrap实际上注册了一个蓝图到你的应用:
class Bootstrap(object):
def __init__(self, app=None):
if app is not None:
self.init_app(app)
def init_app(self, app):
blueprint = Blueprint(
'bootstrap',
__name__,
template_folder='templates',
static_folder='static',
static_url_path=app.static_url_path + '/bootstrap',
subdomain=app.config['BOOTSTRAP_LOCAL_SUBDOMAIN'])
app.register_blueprint(blueprint)
设置一下就可以看清楚了 EXPLAIN_TEMPLATE_LOADING:
app = Flask(__name__)
app.config['EXPLAIN_TEMPLATE_LOADING'] = True
然后
export FLASK_ENV=development
flask run
当您访问页面时:
[2018-07-12 15:28:58,659] INFO in debughelpers: Locating template "user.html":
1: trying loader of application "hello"
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /root/learn/python-lab/Flask/flasky/templates
-> found ('/root/learn/python-lab/Flask/flasky/templates/user.html')
2: trying loader of blueprint "bootstrap" (flask_bootstrap)
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /root/learn/python-lab/Flask/flasky/venv/lib/python3.6/site-packages/flask_bootstrap/templates
-> no match
################################################################# Note here #######
[2018-07-12 15:28:58,677] INFO in debughelpers: Locating template "bootstrap/base.html":
1: trying loader of application "hello"
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /root/learn/python-lab/Flask/flasky/templates
-> no match ### in app path not found
2: trying loader of blueprint "bootstrap" (flask_bootstrap)
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /root/learn/python-lab/Flask/flasky/venv/lib/python3.6/site-packages/flask_bootstrap/templates
## in blueprint path found the bootstrap/base.html
-> found ('/root/learn/python-lab/Flask/flasky/venv/lib/python3.6/site-packages/flask_bootstrap/templates/bootstrap/base.html')
127.0.0.1 - - [12/Jul/2018 15:28:58] "GET /user/Yao HTTP/1.1" 200 -
- 新增,Blueprint模板文件夹被添加到模板的搜索路径中,但优先级低于实际应用程序的模板文件夹,参见http://flask.pocoo.org/docs/1.0/blueprints/#templates
我正在学习 Flask Web 开发,我正在学习的教程介绍了一个名为 Flask-Bootstrap 的扩展。要使用这个扩展,你必须先初始化它,像这样:
from flask_bootstrap import Bootstrap
# ...
bootstrap = Bootstrap(app)
对我来说很奇怪,变量 bootstrap
没有在我的模块的其余部分中使用。但是,如果我注释掉这一行,则会引发 jinja2.exceptions.TemplateNotFound
异常。此外,使用的模板以此行开头:
{% extends "bootstrap/base.html" %}
但是我在 /templates
!
/bootstrap
的目录
我想知道发生了什么:
bootstrap = Bootstrap(app)
行的作用是什么?bootstrap/base.html
住在哪里?
正如@davidism 在他的评论中所说,bootstrap = Bootstrap(app)
行 "installs the extension on the app"。这种安装背后的机制超出了这个答案的范围。
bootstrap/base.html
位于 Flask-Bootstrap 包中。例如,在我的机器上它的绝对路径是:
/Users/sunqingyao/Documents/Projects/flasky/venv/lib/python2.7/site-packages/flask_bootstrap/templates/bootstrap/base.html
内容如下:
{% block doc -%}
<!DOCTYPE html>
<html{% block html_attribs %}{% endblock html_attribs %}>
{%- block html %}
<head>
{%- block head %}
<title>{% block title %}{{title|default}}{% endblock title %}</title>
{%- block metas %}
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{%- endblock metas %}
{%- block styles %}
<!-- Bootstrap -->
<link href="{{bootstrap_find_resource('css/bootstrap.css', cdn='bootstrap')}}" rel="stylesheet">
{%- endblock styles %}
{%- endblock head %}
</head>
<body{% block body_attribs %}{% endblock body_attribs %}>
{% block body -%}
{% block navbar %}
{%- endblock navbar %}
{% block content -%}
{%- endblock content %}
{% block scripts %}
<script src="{{bootstrap_find_resource('jquery.js', cdn='jquery')}}"></script>
<script src="{{bootstrap_find_resource('js/bootstrap.js', cdn='bootstrap')}}"></script>
{%- endblock scripts %}
{%- endblock body %}
</body>
{%- endblock html %}
</html>
{% endblock doc -%}
"how can Jinja2 find base.html
"的答案会在文档中找到相关部分后立即添加。
- 其他答案已经告诉你了
the bootstrap = Bootstrap(app) line "init the extension on the app".
The bootstrap/base.html resides in the Flask-Bootstrap package.
要理解这一点,您必须了解“Flask 的模板搜索路径”
- 应用程序的模板文件夹
- 蓝图的模板文件夹
所以Flask-Bootstrap实际上注册了一个蓝图到你的应用:
class Bootstrap(object):
def __init__(self, app=None):
if app is not None:
self.init_app(app)
def init_app(self, app):
blueprint = Blueprint(
'bootstrap',
__name__,
template_folder='templates',
static_folder='static',
static_url_path=app.static_url_path + '/bootstrap',
subdomain=app.config['BOOTSTRAP_LOCAL_SUBDOMAIN'])
app.register_blueprint(blueprint)
设置一下就可以看清楚了 EXPLAIN_TEMPLATE_LOADING:
app = Flask(__name__)
app.config['EXPLAIN_TEMPLATE_LOADING'] = True
然后
export FLASK_ENV=development
flask run
当您访问页面时:
[2018-07-12 15:28:58,659] INFO in debughelpers: Locating template "user.html":
1: trying loader of application "hello"
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /root/learn/python-lab/Flask/flasky/templates
-> found ('/root/learn/python-lab/Flask/flasky/templates/user.html')
2: trying loader of blueprint "bootstrap" (flask_bootstrap)
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /root/learn/python-lab/Flask/flasky/venv/lib/python3.6/site-packages/flask_bootstrap/templates
-> no match
################################################################# Note here #######
[2018-07-12 15:28:58,677] INFO in debughelpers: Locating template "bootstrap/base.html":
1: trying loader of application "hello"
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /root/learn/python-lab/Flask/flasky/templates
-> no match ### in app path not found
2: trying loader of blueprint "bootstrap" (flask_bootstrap)
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /root/learn/python-lab/Flask/flasky/venv/lib/python3.6/site-packages/flask_bootstrap/templates
## in blueprint path found the bootstrap/base.html
-> found ('/root/learn/python-lab/Flask/flasky/venv/lib/python3.6/site-packages/flask_bootstrap/templates/bootstrap/base.html')
127.0.0.1 - - [12/Jul/2018 15:28:58] "GET /user/Yao HTTP/1.1" 200 -
- 新增,Blueprint模板文件夹被添加到模板的搜索路径中,但优先级低于实际应用程序的模板文件夹,参见http://flask.pocoo.org/docs/1.0/blueprints/#templates