PythonのFlashルーティングフレームワーク4.0

22588 ワード

リダイレクトとエラー
授業:林徳尧(泉舟時代-未来都市技術総監)redirectとabort関数は、エラーページをリダイレクトし、返すために使用されます.
from flask import abort, redirect, url_for

@app.route('/')
def index():
    return redirect(url_for('login'))

@app.route('/login')
def login():
    abort(401)
    this_is_never_executed()

デフォルトのエラーページは空のページで、エラーページをカスタマイズする必要がある場合はerrorhandler装飾器を使用します.
from flask import render_template

@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404

レスポンス処理
デフォルトでは、Flaskは関数の戻り値に基づいて応答の処理方法を自動的に決定します.戻り値が応答オブジェクトの場合、クライアントに直接渡されます.戻り値が文字列の場合、文字列は適切な応答オブジェクトに変換されます.レスポンスオブジェクトの設定方法も自分で決めることができ、方法も簡単で、make_を使うことができます.response関数でいいです.
@app.errorhandler(404)
def not_found(error):
    resp = make_response(render_template('error.html'), 404)
    resp.headers['X-Something'] = 'A value'
    return resp

Sessions
グローバルオブジェクトセッションを使用して、ユーザー・セッションを管理できます.SesisonはCookie技術に基づいているが、FlaskではSessionに鍵を指定することもでき、Cookieに格納されている情報が暗号化され、より安全になる.Flask公式の例を直接見ましょう.
from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

@app.route('/')
def index():
    if 'username' in session:
        return 'Logged in as %s' % escape(session['username'])
    return 'You are not logged in'

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''
        <form method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''

@app.route('/logout')
def logout():
    # remove the username from the session if it's there
    session.pop('username', None)
    return redirect(url_for('index'))

テンプレートの概要
テンプレートラベルは、Jinjaテンプレートと他の言語やフレームワークのテンプレートが似ていますが、いずれもHTMLファイルの特定の要素を何らかの構文で実際の値に置き換えています.JSP、Thymeleafなどのテンプレートを使用したことがあれば、Jinjaテンプレートの使用を容易に習得できるはずです.
実は上の例からJinjaテンプレートの基本文法を見ることができるはずです.コードブロックは、次のような{%}ブロックに含める必要があります.
{% extends 'layout.html' %}
{% block title %}  {% endblock %}
{% block body %}

    <div class="jumbotron">
        <h1>  </h1>
    </div>

{% endblock %}

カッコ内のコンテンツはエスケープされず、すべてのコンテンツがそのまま出力され、他の補助関数とともに使用されることが多い.次に例を示します.
<a class="navbar-brand" href={{ url_for('index') }}>Flask   </a>

継承
テンプレートは他のテンプレートを継承し、レイアウトを親テンプレートに設定し、他のテンプレートを継承することで、プログラム全体の外観を簡単に制御できます.例えばここにlayoutがありますhtmlテンプレートです.プログラム全体のレイアウトファイルです.
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="{{ url_for('static',filename='css/bootstrap.css') }}"/>
    <link rel="stylesheet" href="{{ url_for('static',filename='css/bootstrap-theme.css') }}"/>

</head>
<body>

<div class="container body-content">
    {% block body %}{% endblock %}
</div>

<div class="container footer">
    <hr>
    <p>    </p>
</div>

<script src="{{ url_for('static',filename='js/jquery.js') }}"></script>
<script src="{{ url_for('static',filename='js/bootstrap.js') }}"></script>

</body>
</html>

他のテンプレートはこのように書くことができます.オブジェクト向けプログラミングの継承概念を比較すると,容易に理解できる.
{% extends 'layout.html' %}
{% block title %}  {% endblock %}
{% block body %}

    <div class="jumbotron">
        <h1>  </h1>
        <p>      Flask       ,                。</p>
    </div>

{% endblock %}

せいぎょりゅう
条件判断はこのように書くことができ,JSPタグのJavaコードに類似し,{%}にもPythonコードを書くことができる.Flask公式ドキュメントの例を次に示します.
<div class=metanav>
  {% if not session.logged_in %}
    <a href="{{ url_for('login') }}">log in</a>
  {% else %}
    <a href="{{ url_for('logout') }}">log out</a>
  {% endif %}
  </div>
<tbody>
     {% for key,value in data.items() %}
         <tr>
            <td>{{ key }}</td>
             <td>{{ value }}</td>
         </tr>
     {% endfor %}
        <tr>
            <td>  </td>
            <td></td>
        </tr>
 </tbody>