flashkフレームレンダリングJinjaテンプレートと着信テンプレート変数操作詳細


本論文の例はflashkフレームレンダリングJinjaテンプレートと着信テンプレート変数動作を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
1.テンプレートの概要
テンプレートはweb開発に必要なモジュールです。私たちはページをレンダリングする時に、単にテキストの文字をレンダリングしただけではなく、テキストのラベルが豊富なページをレンダリングします。この時はテンプレートを使う必要があります。flashkでは、セットのテンプレートはJinja 2、Jinja 2の作者もflashkの作者です。
2.flashkでレンダリングテンプレート
flashkでは、テンプレートをレンダリングする必要があるなら、我々はレンダーを使用する必要があります。templateという方法です。
flashkプロジェクトを新築する時に、templatesのフォルダを同時に作成して、その中にindex.のファイルを新規作成します。そしてテストコードを書き込みます。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
</head>
<body>
 <h1>index</h1>
</body>
</html>

その後、私たちはapp.pyファイルに表示関数を書いてindex.ファイルをレンダリングします。

from flask import render_template
@app.route('/index/')
def index():
  return render_template('index.html')

このようにして、私達はこれまでのページをレンダリングすることに成功しました。そして私たちはプロジェクトを実行します。URLを入力すると効果が見えます。
3.flashkでテンプレートファイルを検索するパス
上にいるレンデtemplate関数の中で、なぜ私達は直接index.を書き込みますか?flashはtemplatesフォルダの中にこのファイルを探しに行くと分かります。他の場所に行ってindex.ファイルを探すのではないですね。これはflashにおいて、デフォルトの検索テンプレートの力はプロジェクトのルートディレクトリの下のtemplatesフォルダにあるからです。だから、私たちはテンプレートファイルを書く時、templatesの下に書いています。
flashkでは、私たちもテンプレートの保管場所を変更することができます。たとえば、私たちはテンプレートファイルの保管場所をE:\templatesに変更したら、このように書くことができます。

from flask import Flask,render_template
app = Flask(__name__,template_folder=r'E:\templates')

このように、flashkは毎回テンプレートのファイルのパスを探す時、このフォルダの下に帰って探して、もし見つけられなかったら、ジンja 2.exceptions.TemplateNotFoundのエラーを報告します。だから、このエラーに遭遇した時、私達はどの位置が問題があるかを知りたいです。
4.テンプレートからパラメータが入る
一つのテンプレートの中で、私達は避けられないのがいくつかのパラメーターに入ってきます。flashkの中で、どのようにパラメーターに入るべきですか?
まず、ビューを作成し、レンデ_で。templateには次のusername='xxx'などのキーワードパラメータが入ってきます。

from flask import render_template
@app.route('/index/')
def index():
  return render_template('index.html',username='xxx')

そして私たちはテンプレートでこの変数をどう使いますか?私たちはindex.htmlに下記のコードを書きます。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
</head>
<body>
 <h1>index</h1>
 <p>userneme: {{ username }}</p>
</body>
</html>

だから、私達はテンプレートの中で{username}を通して、私達の沖視から入ってきた値を手に入れることができます。つまり、Jinja 2テンプレートでは、{変数名}を通じてデータを取得しています。もし私たちが{}の中にビューが入ってきたら、私たちに着衣していない変数もあります。間違いなく、何も表示されないだけです。
もし私たちが複数のパラメータを導入する必要があるなら、順番にrender_にいるだけです。template関数から私たちの鍵となるパラメータが入ってきたらいいです。
例:

return render_template('index.html',username='xxx',age=18,...)

しかし、パラメーターが多いと、私たちも管理したり、調べたりするのに不便です。この時は辞書を定義して、すべての変数を保存して、それからテンプレートに入ることができます。
例:

@app.route('/index/')
def index():
 context = {
 'username':'xxx',
 'age':18,
 'height':180,
 }
  return render_template('index.html',context=context)

しかし、この時、私たちはテンプレートに直接入力して、{username}、{age}、{height}を入力すると、私たちのデータが得られません。この方法を使うと、テンプレートの中でパラメータを取得するには、方法を変更する必要があります。こうなります

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
</head>
<body>
 <h1>index</h1>
 <p>userneme: {{ context.username }}</p>
 <p>userneme: {{ context['age'] }}</p>
 <p>userneme: {{ context.height }}</p>
</body>
</html>

上のテンプレートでは、パラメータ、context[username]とcontext.usernameを得るために2つの方法を使いました。contextは辞書ですので、この二つの方法を使ってもいいです。
しかし、このように私たちはまだ不便です。毎回contextを通じて、私たちが入ってきたパラメータを取得することができます。では、私たちはcontextを通してパラメータを得ることができますか?答えは大丈夫です。
例:

@app.route('/index/')
def index():
 context = {
 'username':'xxx',
 'age':18,
 'height':180,
 }
  return render_template('index.html',**context)

私たちはビュー関数にこのように書くと、contextを通して私たちのパラメータを得ることができます。
*contextとは、この辞書を広げてキーワードのパラメータを作ることです。だから、彼と下のような書き方は全く同じです。

@app.route('/index/')
def index():
  return render_template('index.html',username='xxx',age=18,height=180)

一般的にプロジェクトの開発において、私たちは*contextという書き方を使います。
もちろん、私達の実際の開発では、転送データはこんなに簡単ではないはずです。一般的にはデータの入れ子などがあります。対象もあります。
例えば、以下のようにする

#     Person 
class Person():
  def __init__(self,name,age):
    self.name = name
    self.age = age
person = Person('  ', 18) #      Person  
@app.route('/')
def index():
  context = {
    'username':'xujin',
    'age':18,
    'children':{
      'name':'hah',
      'height':190,
    },
    'person':person,
    'list':[1,2,3]
  }
  return render_template('index.html',**context)

実はJinja 2テンプレートの中で、私達はデータに対する操作とpythonは同じです。上のようなデータは次のように取得できます。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
</head>
<body>
<h1>index</h1>
hello {{ username }}
<p> {{ children.name}} </p>
<p> {{ children['height'] }} </p>
{{ person }}
{{ person.name }}
{{ person.age }}
{{ list }}
{{ list[1] }}
</body>
</html>

5.url_forの使用
テンプレートの中では、私達は基本的にはurlアドレスが必要ですが、直接手動でurlアドレスを書き込むと、私達の後の管理に不便です。だから、私達は普通url_を使います。for関数は私たちのurlを構成します。
例えば、私たちはloginページを持っています。そして、トップページからログインしてから、loginページにジャンプする必要がありますか?

@app.route('/login/')
def login():
  return "  login  "
@app.route('/index/')
def login():
  return render_template('index.html')

そして私たちはindex.1に書き込みます。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
</head>
<body>
<h1>index</h1>
<p><a href="/login/" rel="external nofollow" >  </a></p>
<p><a href="{{ url_for('login') }}" rel="external nofollow" >  </a></p>
</body>
</html>

上記の2つの方法の一つは直接的に死urlを書く方法で、一つはurl cuuを使う方法です。forの方式。私たちは普通、url cuuを使います。forという方式のです。
私たちのurlがパラメータを必要とするなら、実際にはビューに入るパラメータと同じです。
例:

@app.route('/user/<int:user_id>/')
def user(user_id):
 return "user id is %s " % user_id

テンプレートファイルに書き込み

<a href="{{ url_for('user',user_id=1,next='xxx') }}" rel="external nofollow" >user</a>
<!--         -->
<a href="/user/1/?next=xxx" rel="external nofollow" >user</a>

本稿で述べたいのですが、flashkフレームに基づくPythonプログラムの設計に役立ちます。