7

私は Flask Web 開発を学んでおり、フォローしているチュートリアルではFlask-Bootstrapという拡張機能が紹介されています。この拡張機能を使用するには、次のように最初に初期化する必要があります。

from flask_bootstrap import Bootstrap
# ...
bootstrap = Bootstrap(app)

奇妙なことに、この変数bootstrapはモジュールの残りの部分では使用されていません。ただし、この行をコメントアウトすると、jinja2.exceptions.TemplateNotFound例外が発生します。また、使用されるテンプレートは次の行で始まります。

{% extends "bootstrap/base.html" %}

しかし、私は!という/bootstrap名前のディレクトリを持っていません。/templates

何が起こっているのか知りたい:

  1. ラインは何をしbootstrap = Bootstrap(app)ますか?
  2. どこに住んでいbootstrap/base.htmlますか?
4

2 に答える 2

4
  • 他の答えがあなたに言った

bootstrap = Bootstrap(app) 行「アプリの拡張機能を初期化」。

bootstrap/base.html は Flask-Bootstrap パッケージにあります。

これを理解するには、「Flask のテンプレート検索パス」について知っておく必要があります。

  1. アプリケーションのテンプレート フォルダ
  2. ブループリントのテンプレート フォルダ

つまり、Flask-Bootstrap は実際に設計図をアプリに登録します。</p>

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 -
于 2018-07-12T08:17:37.887 に答える
2

@davidism がコメントで述べたように、このbootstrap = Bootstrap(app)行は「アプリに拡張機能をインストールする」というものです。このようなインストールの背後にあるメカニズムは、この回答の範囲を超えています。

bootstrap/base.htmlFlask-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 -%}

「Jinja2 の検索方法」に対する回答base.htmlは、ドキュメント内の関連部分が見つかり次第追加されます。

于 2016-09-10T15:36:52.847 に答える