私の個人的なアイデアや理解のより、本の内容だけではなく、私はこの1つは私に大きな助けとインスピレーションを与えたと言わなければならないので、これは私が書くと良い要約です
まず、すべてのアイデアや知識のコード生成にapp.pyコードに沿って
輸入OS フラスコインポートフラスコ、render_template、フラッシュ、リダイレクトから、なurl_for、マークアップ アプリ=フラスコ(__ name__) app.secret_key = os.getenv( 'SECRET_KEY'、 '秘密の文字列は、') = Trueのapp.jinja_env.trim_blocks app.jinja_envを。 lstrip_blocks = Trueの ユーザー= { 「ユーザ名」:「グレー李」、 「バイオ」: '。映画や音楽を愛する少年、 } 映画= [ {「名前」:「となりのトトロ」、「年」:' 1988 '}、 {'名前': '3色三部作'、 '年': '1993'}、 {'名前': 'フォレストガンプ'、 '年': '1994'}、 {'名前':'パーフェクトブルー「 『年』:」1997 '}、 {'名前': 'マトリックス'、 '年': '1999'}、 {'名前': 'メメント'、 '年': '2000'}、 {'名前': 'バケットリスト'、 '年': '2007'}、 { '名前': 'ブラックスワン'、 '年': '2010'}、 { '名前': 'ゴーン・ガール'、 '年': '2014'}、 { '名前': 'ココ'、 '今年'2017'} ] app.route( '/ウォッチリスト')@ デフウォッチリスト(): 戻りrender_template( 'watchlist.html'、ユーザ=利用者、映画=ムービー) app.route @( '/') 指数DEF (): リターンrender_template( 'index.htmlを')# レジスタテンプレートコンテキストハンドラ #自定义上下文变量、返回值必须为字典 @ app.context_processor デフinject_info(): FOO = '私がfooです。' リターン{ 'FOO'に等しい戻り辞書(FOO = FOO)#: #カスタムグローバル関数 @ app.template_global() DEFバー(): リターン'私はバーです。' #テンプレートフィルタ登録 する@ app.template_filter() :DEF音楽(S) リターンS +マークアップ( '♫') #レジスタテンプレートテスト する@ app.template_test() DEFバズ(N): もしN == 'バズ': リターン真の リターン偽 の@ app.route( '/ watchlist2') DEF watchlist_with_static(): リターンrender_template( 'watchlist_with_static.html'、ユーザー=ユーザー、映画=映画) 点滅#メッセージ app.route( '/フラッシュ')@ DEF just_flash (): フラッシュ( '?私は私を探しているフラッシュ、午前') リターンリダイレクト(なurl_for( 'インデックス')) app.errorhandler(404)@は デフ(e)をpage_not_found: 戻りrender_template( 'エラー/ 404.html')、404 #500エラーハンドラ の@ app.errorhandler(500) デフINTERNAL_SERVER_ERROR(E): リターンrender_template( 'エラー/ 500.html')、500 app.run(デバッグ=真)
まず、インスタンスを作成します
情報ユーザリストや映画のすべてが、この情報の出力に戻るには、HTMLページで、新しいURLを新しいURLに達しました
だからここが新しいwatchlist.htmlを作成し、目的は、着信コンテンツを視聴するには、対応するHTML URL関数を返すことです
watchlist.htmlコード
<!DOCTYPE HTML> <HTML LANG = "EN"> <HEAD> <メタ文字コード= "UTF-8"> <タイトル> {{user.username}}のウォッチリスト</ TITLE> </ HEAD> <BODY> <a href="{{ url_for('index') }}">←戻る</a>の <H2> {{user.username}} </ H2> {%ならuser.bio%} <I> {{ user.boio}} </ i>は 、{%他%} <I>このユーザは、生体を提供していない。</ I> {%のENDIFの%} <H5> {{user.username}}のウォッチ・リスト({{ムービー|長さ}})</ H5> <UL> 映画の中で映画%}の{% <LI> {{movie.name}} - {{movie.year}} </ LI> {%ENDFOR%} </ UL> </ body> </ HTML>
また、一般的にJinja2のテンプレートの構文で使用される2つの知識ポイントは、forループと判断場合があります
唯一の注目すべき事は、対応するエンドに対応するであろう開始することです
{%XXX%の場合} ----- {%ENDIF%}
{XXX%用%} ---- {%ENDFOR%}
テンプレート内の変数は、ビュー機能をインポートする必要があります
コードの流れ、その後の分析:
1.コンテキスト変数:
コンテキスト変数は、モジュールがグローバル変数に対応し、モジュールに直接使用することができます。
コンテキストデコレータ@のapp.context_processorを使用したカスタム変数
(1)@ app.context_processor
デフXXX():
パス
(2)コースの機能を定義することにより、この関数は、のようにして処理に戻ります
デフXXX():
パス
app.context_processor(XXX)
2.グローバル関数:グローバル関数は、すべてのモジュールの同等品を使用することが可能です。
app.template_global @:グローバル関数は、カスタムデコレータの使用であります:
3.フィルタ:テンプレートツール、操作対象|濾過法(例えばwatchlist.html {{映画|長さ}})を計算どのくらいムービー
4.テスター:テスターは、文字通りの意味と比較試験から決定するために使用されます
キーデコレータする@ app.templat_text()は、次の例を、比較に応じて結果を返すために、次にバズ機能着信パラメータ、比較、そしてすることを意味するように
基本テンプレート:Jinja2のの魂に来ます
人気理解するために、テンプレートベースの意味は、ブロックを共有しています
ブロックテンプレートの概念は、いくつかのブロックに分割し、
<!DOCTYPE HTML> <HTML> <HEAD> {%ブロックヘッド%} <メタのcharset = "UTF-8"> <タイトル> {%ブロックタイトル%}テンプレート- HelloFlask {%の末端ブロック%} </タイトル> <リンクREL = "アイコン"タイプ= "画像/ Xアイコン" HREF = "{{( '静的'、ファイル名= 'favicon.icoを')}なurl_for}"> {%ブロックスタイル%} <リンクREL = "スタイルシート"タイプ= "テキスト/ CSS" HREF = "{{なurl_for( '静的'、ファイル名= 'style.cssに')}}"> {%の末端ブロック%} {%の末端ブロック%} </ HEAD> <BODY> <NAV> <UL> <LI> <HREF = "{{なurl_for( 'インデックス')}} ">ホーム</a>の</ LI> </ UL> </ NAV> <メイン> {%ENDFOR%} {get_flashed_messagesにおけるメッセージの%()%} <DIV CLASS = "警告"> {{メッセージ}} </ div> {%ブロック含量%} {%の末端ブロック%} </メイン> <フッタ> {%ブロックフッタ%} <小> 2018©<HREF = 「http://greyli.com」タイトル=「グレーリーによって書かれた」>グレー李</a>の/ <のhref =「https://github.com/greyli/helloflask」タイトル=「GitHubの上で私をフォーク」 > GitHubの</a>の/ <a href="http://helloflask.com" title="A HelloFlask project"> HelloFlask </a>の </小> {%の末端ブロック%} </フッタ> {%ブロックスクリプト%} {%の末端ブロック%} </ BODY> </ HTML>
上記の分析コードから
{%ブロックヘッド%}二つのブロックが存在します
キャプションの{%ブロックタイトル%}であります
別のエンドブロックに対応する{%のendblcokの%}キーワードを使用する必要があり、読み出しCSSリンクブロックを各端部を格納するための{%ブロックスタイル%}です。
最初のジャンプで、<body>タグではホーム・ページにジャンプする小さなホームボタンがあり、
その後、サブモジュールの継承を容易にするために、メッセージ内の<メイン>タグフラッシュメッセージを読み取り、情報の{%ブロックコンテンツ%}のために保存
フッター情報を格納するために使用される{%ブロックフッタ%}ブロック内の<フッタ>タグを作成します。
最後のブロックは、配置ブロックリンクの{%ブロックスクリプト%} JSのスクリプトであります
前記サブテンプレートの継承
限り、子が継承されるように、テンプレートベースのモジュールは、「ベース・テンプレート名を」拡張テンプレートを使用し始めました
そして、コンテンツや書き込みの内容は、メインモジュールは、操作ブロック内で定義されていなければならないとき、
{%ブロックコンテンツ%} {XXX%の末端ブロック%}、中間サブモジュールの内容が追加されます。
7.ロード静的ファイル(js.css.img)
次のように静的ファイル、{%ブロックスタイル%}ローディングCSSファイルをロードするための<link>タグを使用して、ファイルは、JS {%ブロックスクリプト%}にロードされます
8.マクロ
9.マクロロード静的ファイル
10.ロードFavion:ページには、小さなアイコンが表示されています
リンクタグはモジュールで直接使用し、ラベルファイルの選択のプロパティに注意を払います