How Flask-Bootstrap works?
- Other answers have told you
the bootstrap = Bootstrap(app) line "init the extension on the app".
The bootstrap/base.html resides in the Flask-Bootstrap package.
To understand this, you must know something about "Flask's template searchpath"
- application's template folder
- Blueprint's template folder
So the Flask-Bootstrap actually register a blueprint to your app:
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)
You can see it clearly by set EXPLAIN_TEMPLATE_LOADING:
app = Flask(__name__)app.config['EXPLAIN_TEMPLATE_LOADING'] = True
then
export FLASK_ENV=developmentflask run
when you access the page:
[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 found2: 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 -
- Addition,The Blueprint template folder is added to the search path of templates but with a lower priority than the actual application’s template folder, see http://flask.pocoo.org/docs/1.0/blueprints/#templates
As @davidism said in his comment, the bootstrap = Bootstrap(app)
line "installs the extension on the app". The mechanism behind such installation is beyond the scope of this answer.
The bootstrap/base.html
resides in the Flask-Bootstrap package. For example, on my machine it's absolute path is:
/Users/sunqingyao/Documents/Projects/flasky/venv/lib/python2.7/site-packages/flask_bootstrap/templates/bootstrap/base.html
Here is its content:
{% 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 -%}
The answer to "how can Jinja2 find base.html
" would be added as soon as I find the relevant part in the document.