クイックスタート—フラスコのドキュメント

提供:Dev Guides
< FlaskFlask/docs/2.0.x/quickstart
移動先:案内検索

クイックスタート

始めたいですか? このページでは、Flaskの概要を説明しています。 インストールに従ってプロジェクトをセットアップし、最初にFlaskをインストールします。

最小限のアプリケーション

最小限のFlaskアプリケーションは次のようになります。

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

では、そのコードは何をしましたか?

  1. まず、Flaskクラスをインポートしました。 このクラスのインスタンスは、WSGIアプリケーションになります。
  2. 次に、このクラスのインスタンスを作成します。 最初の引数は、アプリケーションのモジュールまたはパッケージの名前です。 __name__は、このための便利なショートカットであり、ほとんどの場合に適しています。 これは、Flaskがテンプレートや静的ファイルなどのリソースを探す場所を認識できるようにするために必要です。
  3. 次に、route()デコレータを使用して、関数をトリガーするURLをFlaskに指示します。
  4. この関数は、ユーザーのブラウザに表示したいメッセージを返します。 デフォルトのコンテンツタイプはHTMLであるため、文字列内のHTMLはブラウザによってレンダリングされます。

hello.pyなどで保存してください。 アプリケーションflask.pyを呼び出さないでください。これは、Flask自体と競合する可能性があります。

アプリケーションを実行するには、 Flask コマンドまたは python-mflask を使用します。 その前に、FLASK_APP環境変数をエクスポートして、アプリケーションが動作するように端末に指示する必要があります。

アプリケーション検出動作

ショートカットとして、ファイルの名前がapp.pyまたはwsgi.pyの場合、FLASK_APP環境変数を設定する必要はありません。 詳細については、コマンドラインインターフェイスを参照してください。


これにより、非常に単純な組み込みサーバーが起動します。これはテストには十分ですが、本番環境で使用したいものではない可能性があります。 展開オプションについては、展開オプションを参照してください。

http://127.0.0.1:5000/ にアクセスすると、HelloWorldの挨拶が表示されます。

外部から見えるサーバー

サーバーを実行すると、サーバーには自分のコンピューターからのみアクセスでき、ネットワーク内の他のコンピューターからはアクセスできないことがわかります。 デバッグモードでは、アプリケーションのユーザーがコンピューター上で任意のPythonコードを実行できるため、これがデフォルトです。

デバッガーを無効にしている場合、またはネットワーク上のユーザーを信頼している場合は、コマンドラインに--host=0.0.0.0を追加するだけで、サーバーを公開できます。

$ flask run --host=0.0.0.0

これにより、オペレーティングシステムはすべてのパブリックIPをリッスンするようになります。


サーバーが起動しない場合の対処方法

python -mフラスコが失敗した場合、またはフラスコが存在しない場合は、複数の理由が考えられます。 まず、エラーメッセージを確認する必要があります。

古いバージョンのFlask

0.11より古いバージョンのFlaskには、アプリケーションを起動するさまざまな方法がありました。 つまり、 flags コマンドは存在せず、 python-mflask も存在しませんでした。 その場合、2つのオプションがあります。新しいFlaskバージョンにアップグレードするか、開発サーバーを参照して、サーバーを実行するための代替方法を確認してください。


無効なインポート名

FLASK_APP環境変数は、フラスコ実行でインポートするモジュールの名前です。 モジュールの名前が間違っている場合、起動時にインポートエラーが発生します(または、アプリケーションに移動するときにデバッグが有効になっている場合)。 何をインポートしようとしたのか、なぜ失敗したのかがわかります。

最も一般的な理由は、タイプミス、または実際にappオブジェクトを作成しなかったためです。


デバッグモード

flask runコマンドは、開発サーバーを起動するだけではありません。 デバッグモードを有効にすることで、コードが変更された場合にサーバーが自動的にリロードし、リクエスト中にエラーが発生した場合にブラウザにインタラクティブデバッガーが表示されます。

class=screenshot align-center|The interactive debugger in action.

警告

デバッガーを使用すると、ブラウザーから任意のPythonコードを実行できます。 ピンで保護されていますが、それでも大きなセキュリティリスクがあります。 実稼働環境で開発サーバーまたはデバッガーを実行しないでください。


すべての開発機能を有効にするには、flask runを呼び出す前に、FLASK_ENV環境変数をdevelopmentに設定します。

参考


HTMLエスケープ

HTML(Flaskのデフォルトの応答タイプ)を返す場合、インジェクション攻撃から保護するために、出力にレンダリングされたユーザー指定の値をエスケープする必要があります。 後で紹介するJinjaでレンダリングされたHTMLテンプレートは、これを自動的に実行します。

ここに示すescape()は、手動で使用できます。 簡潔にするためにほとんどの例では省略されていますが、信頼できないデータをどのように使用しているかを常に認識しておく必要があります。

from markupsafe import escape

@app.route("/<name>")
def hello(name):
    return f"Hello, {escape(name)}!"

ユーザーが名前<script>alert("bad")</script>を送信できた場合、エスケープすると、ユーザーのブラウザーでスクリプトを実行するのではなく、テキストとしてレンダリングされます。

ルート内の<name>は、URLから値をキャプチャし、それをビュー関数に渡します。 これらの可変ルールについて、以下で説明します。


ルーティング

最新のWebアプリケーションは、意味のあるURLを使用してユーザーを支援します。 ユーザーは、覚えてページに直接アクセスするために使用できる意味のあるURLをページが使用している場合、ページを気に入って戻ってくる可能性が高くなります。

route()デコレータを使用して、関数をURLにバインドします。

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'

あなたはもっとできる! URLの一部を動的にし、複数のルールを関数に添付できます。

可変ルール

セクションに<variable_name>のマークを付けると、可変セクションをURLに追加できます。 次に、関数は<variable_name>をキーワード引数として受け取ります。 オプションで、コンバーターを使用して、<converter:variable_name>のような引数のタイプを指定できます。

from markupsafe import escape

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return f'User {escape(username)}'

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return f'Post {post_id}'

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    # show the subpath after /path/
    return f'Subpath {escape(subpath)}'

コンバーターの種類:

string (デフォルト)スラッシュなしのテキストを受け入れます
int 正の整数を受け入れます
float 正の浮動小数点値を受け入れます
path stringと同様ですが、スラッシュも使用できます
uuid UUID文字列を受け入れます


一意のURL /リダイレクト動作

次の2つのルールは、末尾のスラッシュの使用が異なります。

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'

projectsエンドポイントの正規URLには、末尾にスラッシュがあります。 これは、ファイルシステムのフォルダに似ています。 末尾のスラッシュなしでURLにアクセスすると(/projects)、Flaskは末尾のスラッシュ付きの正規URL(/projects/)にリダイレクトします。

aboutエンドポイントの正規URLには、末尾にスラッシュがありません。 これは、ファイルのパス名に似ています。 末尾にスラッシュ(/about/)を付けてURLにアクセスすると、404「NotFound」エラーが発生します。 これにより、これらのリソースに対してURLを一意に保つことができ、検索エンジンが同じページに2回インデックスを付けることを回避できます。


URL構築

特定の関数へのURLを作成するには、url_for()関数を使用します。 関数の名前を最初の引数として受け入れ、それぞれがURLルールの可変部分に対応する任意の数のキーワード引数を受け入れます。 不明な変数部分は、クエリパラメータとしてURLに追加されます。

テンプレートにハードコーディングする代わりに、URL反転機能url_for()を使用してURLを作成するのはなぜですか?

  1. 多くの場合、逆にすると、URLをハードコーディングするよりもわかりやすくなります。
  2. ハードコードされたURLを手動で変更することを覚えておく必要はなく、一度にURLを変更できます。
  3. URL構築は、特殊文字のエスケープを透過的に処理します。
  4. 生成されたパスは常に絶対パスであり、ブラウザーでの相対パスの予期しない動作を回避します。
  5. アプリケーションがURLルートの外、たとえば/ではなく/myapplicationに配置されている場合、url_for()はそれを適切に処理します。

たとえば、ここではtest_request_context()メソッドを使用してurl_for()を試します。 test_request_context()は、Pythonシェルを使用している間でも、リクエストを処理しているように動作するようにFlaskに指示します。 コンテキストローカルを参照してください。

from flask import url_for

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

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

@app.route('/user/<username>')
def profile(username):
    return f'{username}\'s profile'

with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login', next='/'))
    print(url_for('profile', username='John Doe'))
/
/login
/login?next=/
/user/John%20Doe

HTTPメソッド

Webアプリケーションは、URLにアクセスするときにさまざまなHTTPメソッドを使用します。 Flaskを使用するときは、HTTPメソッドに精通している必要があります。 デフォルトでは、ルートはGETリクエストにのみ応答します。 route()デコレータのmethods引数を使用して、さまざまなHTTPメソッドを処理できます。

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

GETが存在する場合、FlaskはHEADメソッドのサポートを自動的に追加し、 HTTP RFC に従ってHEAD要求を処理します。 同様に、OPTIONSは自動的に実装されます。


静的ファイル

動的Webアプリケーションにも静的ファイルが必要です。 これは通常、CSSファイルとJavaScriptファイルの出所です。 理想的には、Webサーバーがそれらを提供するように構成されていますが、開発中にFlaskもそれを行うことができます。 パッケージ内またはモジュールの横にstaticというフォルダーを作成するだけで、アプリケーションの/staticで使用できるようになります。

静的ファイルのURLを生成するには、特別な'static'エンドポイント名を使用します。

url_for('static', filename='style.css')

ファイルはstatic/style.cssとしてファイルシステムに保存する必要があります。


レンダリングテンプレート

Python内からHTMLを生成するのは面白くなく、アプリケーションを安全に保つためにHTMLエスケープを自分で行う必要があるため、実際にはかなり面倒です。 そのため、Flaskは Jinja2 テンプレートエンジンを自動的に構成します。

テンプレートをレンダリングするには、render_template()メソッドを使用できます。 テンプレートの名前と、テンプレートエンジンにキーワード引数として渡す変数を指定するだけです。 テンプレートをレンダリングする方法の簡単な例を次に示します。

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)

Flaskは、templatesフォルダーでテンプレートを探します。 したがって、アプリケーションがモジュールの場合、このフォルダーはそのモジュールの隣にあり、パッケージの場合、実際にはパッケージ内にあります。

ケース1 :モジュール:

/application.py
/templates
    /hello.html

ケース2 :パッケージ:

/application
    /__init__.py
    /templates
        /hello.html

テンプレートの場合、Jinja2テンプレートの全機能を使用できます。 詳細については、公式の Jinja2テンプレートドキュメントにアクセスしてください。

テンプレートの例を次に示します。

<!doctype html>
<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello, World!</h1>
{% endif %}

テンプレート内では、configrequestsessiong 1 オブジェクト、およびurl_for()およびget_flashed_messages()機能。

テンプレートは、継承が使用されている場合に特に役立ちます。 それがどのように機能するかを知りたい場合は、テンプレート継承を参照してください。 基本的に、テンプレートの継承により、各ページに特定の要素(ヘッダー、ナビゲーション、フッターなど)を保持できます。

自動エスケープが有効になっているため、nameにHTMLが含まれている場合は、自動的にエスケープされます。 変数を信頼でき、それが安全なHTMLであることがわかっている場合(たとえば、ウィキマークアップをHTMLに変換するモジュールからのものであるため)、Markupクラスを使用するか、を使用して、変数を安全としてマークできます。テンプレートの|safeフィルター。 その他の例については、Jinja2のドキュメントをご覧ください。

Markupクラスがどのように機能するかについての基本的な紹介は次のとおりです。

>>> from markupsafe import Markup
>>> Markup('<strong>Hello %s!</strong>') % '<blink>hacker</blink>'
Markup('<strong>Hello &lt;blink&gt;hacker&lt;/blink&gt;!</strong>')
>>> Markup.escape('<blink>hacker</blink>')
Markup('&lt;blink&gt;hacker&lt;/blink&gt;')
>>> Markup('<em>Marked up</em> &raquo; HTML').striptags()
'Marked up \xbb HTML'

バージョン0.5で変更:自動エスケープがすべてのテンプレートで有効ではなくなりました。 テンプレートの次の拡張機能は、自動エスケープをトリガーします:.html.htm.xml.xhtml。 文字列からロードされたテンプレートでは、自動エスケープが無効になります。


1
その g オブジェクトが何であるかわからないですか? 自分のニーズに合わせて情報を保存できるものです。 flask.g および FlaskでのSQLite3の使用のドキュメントを参照してください。


リクエストデータへのアクセス

Webアプリケーションの場合、クライアントがサーバーに送信するデータに対応することが重要です。 Flaskでは、この情報はグローバル request オブジェクトによって提供されます。 Pythonの経験がある場合は、そのオブジェクトをグローバルにする方法と、Flaskがスレッドセーフを維持する方法について疑問に思われるかもしれません。 答えはコンテキストローカルです:

コンテキストローカル

インサイダー情報

それがどのように機能し、コンテキストローカルでテストを実装する方法を理解したい場合は、このセクションを読んでください。それ以外の場合はスキップしてください。


Flaskの特定のオブジェクトはグローバルオブジェクトですが、通常の種類ではありません。 これらのオブジェクトは、実際には特定のコンテキストに対してローカルなオブジェクトのプロキシです。 なんて一口。 しかし、それは実際には非常に理解しやすいものです。

コンテキストが処理スレッドであると想像してください。 リクエストが届き、Webサーバーは新しいスレッドを生成することを決定します(または他の何か、基礎となるオブジェクトはスレッド以外の同時実行システムを処理できます)。 Flaskが内部リクエストの処理を開始すると、現在のスレッドがアクティブコンテキストであることがわかり、現在のアプリケーションとWSGI環境をそのコンテキスト(スレッド)にバインドします。 これはインテリジェントな方法で行われるため、あるアプリケーションが中断することなく別のアプリケーションを呼び出すことができます。

それで、これはあなたにとってどういう意味ですか? 基本的に、ユニットテストのようなことをしているのでない限り、これが事実であることを完全に無視することができます。 リクエストオブジェクトがないため、リクエストオブジェクトに依存するコードが突然壊れることに気付くでしょう。 解決策は、リクエストオブジェクトを自分で作成し、それをコンテキストにバインドすることです。 単体テストの最も簡単な解決策は、test_request_context()コンテキストマネージャーを使用することです。 withステートメントと組み合わせて、テストリクエストをバインドし、操作できるようにします。 次に例を示します。

from flask import request

with app.test_request_context('/hello', method='POST'):
    # now you can do something with the request until the
    # end of the with block, such as basic assertions:
    assert request.path == '/hello'
    assert request.method == 'POST'

もう1つの可能性は、WSGI環境全体をrequest_context()メソッドに渡すことです。

with app.request_context(environ):
    assert request.method == 'POST'

リクエストオブジェクト

リクエストオブジェクトはAPIセクションに記載されているため、ここでは詳しく説明しません(Requestを参照)。 これは、最も一般的な操作のいくつかの概要です。 まず、flaskモジュールからインポートする必要があります。

from flask import request

現在のリクエストメソッドは、method属性を使用して利用できます。 フォームデータ(POSTまたはPUTリクエストで送信されたデータ)にアクセスするには、form属性を使用できます。 上記の2つの属性の完全な例を次に示します。

@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
        else:
            error = 'Invalid username/password'
    # the code below is executed if the request method
    # was GET or the credentials were invalid
    return render_template('login.html', error=error)

form属性にキーが存在しない場合はどうなりますか? その場合、特別なKeyErrorが発生します。 標準のKeyErrorのようにキャッチできますが、そうしないと、代わりにHTTP 400 BadRequestエラーページが表示されます。 したがって、多くの状況では、その問題に対処する必要はありません。

URL(?key=value)で送信されたパラメーターにアクセスするには、args属性を使用できます。

searchword = request.args.get('key', '')

get を使用するか、KeyErrorをキャッチしてURLパラメータにアクセスすることをお勧めします。これは、ユーザーがURLを変更し、その場合に400の不正なリクエストページを表示するのはユーザーフレンドリーではないためです。

リクエストオブジェクトのメソッドと属性の完全なリストについては、Requestのドキュメントをご覧ください。


ファイルのアップロード

アップロードしたファイルはFlaskで簡単に処理できます。 HTMLフォームにenctype="multipart/form-data"属性を設定することを忘れないでください。そうしないと、ブラウザがファイルをまったく送信しません。

アップロードされたファイルは、メモリまたはファイルシステムの一時的な場所に保存されます。 これらのファイルにアクセスするには、リクエストオブジェクトのfiles属性を確認します。 アップロードされた各ファイルは、その辞書に保存されます。 標準のPython fileオブジェクトと同じように動作しますが、サーバーのファイルシステムにそのファイルを保存できるsave()メソッドもあります。 これがどのように機能するかを示す簡単な例を次に示します。

from flask import request

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('/var/www/uploads/uploaded_file.txt')
    ...

アプリケーションにアップロードする前にクライアントでファイルにどのような名前が付けられたかを知りたい場合は、filename属性にアクセスできます。 ただし、この値は偽造される可能性があるため、決してその値を信頼しないでください。 クライアントのファイル名を使用してファイルをサーバーに保存する場合は、Werkzeugが提供するsecure_filename()関数にファイルを渡します。

from werkzeug.utils import secure_filename

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['the_file']
        file.save(f"/var/www/uploads/{secure_filename(file.filename)}")
    ...

より良い例については、ファイルのアップロードを参照してください。


クッキー

Cookieにアクセスするには、cookies属性を使用できます。 Cookieを設定するには、応答オブジェクトのset_cookieメソッドを使用できます。 リクエストオブジェクトのcookies属性は、クライアントが送信するすべてのCookieを含む辞書です。 セッションを使用する場合は、Cookieを直接使用せずに、Flaskの Sessions を使用して、Cookieにセキュリティを追加します。

クッキーを読む:

from flask import request

@app.route('/')
def index():
    username = request.cookies.get('username')
    # use cookies.get(key) instead of cookies[key] to not get a
    # KeyError if the cookie is missing.

クッキーの保存:

from flask import make_response

@app.route('/')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('username', 'the username')
    return resp

Cookieは応答オブジェクトに設定されていることに注意してください。 通常はビュー関数から文字列を返すだけなので、Flaskはそれらを応答オブジェクトに変換します。 明示的に実行したい場合は、make_response()関数を使用して変更できます。

応答オブジェクトがまだ存在しないポイントにCookieを設定したい場合があります。 これは、遅延要求コールバックパターンを利用することで可能になります。

これについては、応答についても参照してください。


リダイレクトとエラー

ユーザーを別のエンドポイントにリダイレクトするには、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()

これは、ユーザーがインデックスからアクセスできないページにリダイレクトされるため(401はアクセスが拒否されたことを意味します)、かなり無意味な例ですが、それがどのように機能するかを示しています。

デフォルトでは、エラーコードごとに白黒のエラーページが表示されます。 エラーページをカスタマイズする場合は、errorhandler()デコレータを使用できます。

from flask import render_template

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

render_template()呼び出しの後の404に注意してください。 これは、そのページのステータスコードが404である必要があることをFlaskに通知します。これは、見つからないことを意味します。 デフォルトでは200が想定されており、これは次のように解釈されます。すべてうまくいきました。

詳細については、アプリケーションエラーの処理を参照してください。


回答について

ビュー関数からの戻り値は、自動的に応答オブジェクトに変換されます。 戻り値が文字列の場合、応答本文としての文字列、200 OKステータスコード、および text / html mimetypeを使用して応答オブジェクトに変換されます。 戻り値がdictの場合、jsonify()が呼び出されて応答が生成されます。 Flaskが戻り値を応答オブジェクトに変換するために適用するロジックは次のとおりです。

  1. 正しいタイプの応答オブジェクトが返されると、ビューから直接返されます。
  2. 文字列の場合、そのデータとデフォルトのパラメータを使用して応答オブジェクトが作成されます。
  3. dictの場合、応答オブジェクトはjsonifyを使用して作成されます。
  4. タプルが返される場合、タプル内のアイテムは追加情報を提供できます。 このようなタプルは、(response, status)(response, headers)、または(response, status, headers)の形式である必要があります。 status値はステータスコードを上書きし、headersは追加のヘッダー値のリストまたは辞書にすることができます。
  5. それでも機能しない場合、Flaskは戻り値が有効なWSGIアプリケーションであると見なし、それを応答オブジェクトに変換します。

ビュー内で結果の応答オブジェクトを取得したい場合は、make_response()関数を使用できます。

次のようなビューがあると想像してください。

from flask import render_template

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

戻り式をmake_response()でラップし、応答オブジェクトを取得して変更してから、次のように返す必要があります。

from flask import 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

JSONを使用したAPI

APIを作成する際の一般的な応答形式はJSONです。 Flaskを使用してこのようなAPIの作成を開始するのは簡単です。 ビューからdictを返すと、JSON応答に変換されます。

@app.route("/me")
def me_api():
    user = get_current_user()
    return {
        "username": user.username,
        "theme": user.theme,
        "image": url_for("user_image", filename=user.image),
    }

APIの設計によっては、dict以外のタイプのJSON応答を作成することもできます。 その場合は、jsonify()関数を使用して、サポートされているJSONデータ型をシリアル化します。 または、より複雑なアプリケーションをサポートするFlaskコミュニティ拡張機能を調べてください。

from flask import jsonify

@app.route("/users")
def users_api():
    users = get_all_users()
    return jsonify([user.to_json() for user in users])

セッション

リクエストオブジェクトに加えて、 session と呼ばれる2番目のオブジェクトもあります。これにより、あるリクエストから次のリクエストへのユーザー固有の情報を保存できます。 これはCookieの上に実装され、Cookieに暗号で署名します。 つまり、ユーザーは、署名に使用される秘密鍵を知らない限り、Cookieの内容を確認することはできますが、変更することはできません。

セッションを使用するには、秘密鍵を設定する必要があります。 セッションの仕組みは次のとおりです。

from flask import session

# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

@app.route('/')
def index():
    if 'username' in session:
        return f'Logged in as {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'))

良い秘密鍵を生成する方法

秘密鍵は可能な限りランダムにする必要があります。 オペレーティングシステムには、暗号化ランダムジェネレータに基づいてかなりランダムなデータを生成する方法があります。 次のコマンドを使用して、Flask.secret_key(または SECRET_KEY )の値をすばやく生成します。

$ python -c 'import secrets; print(secrets.token_hex())'
'192b9bdd22ab9ed4d12e236c78afcb9a393ec15f71bbf5dc987d54727823bcbf'

Cookieベースのセッションに関する注意:Flaskは、セッションオブジェクトに入力した値を取得し、それらをCookieにシリアル化します。 一部の値がリクエスト間で保持されない場合、Cookieが実際に有効になっていて、明確なエラーメッセージが表示されない場合は、Webブラウザでサポートされているサイズと比較したページ応答のCookieのサイズを確認してください。

デフォルトのクライアント側ベースのセッションに加えて、代わりにサーバー側でセッションを処理する場合は、これをサポートするいくつかのFlask拡張機能があります。


メッセージの点滅

優れたアプリケーションとユーザーインターフェイスはすべてフィードバックに関するものです。 ユーザーが十分なフィードバックを受け取らない場合、おそらくアプリケーションを嫌うことになります。 Flaskは、フラッシュシステムを使用してユーザーにフィードバックを提供するための非常に簡単な方法を提供します。 フラッシュシステムは基本的に、リクエストの最後にメッセージを記録し、次の(そして次の)リクエストでそれにアクセスすることを可能にします。 これは通常、メッセージを公開するためにレイアウトテンプレートと組み合わされます。

メッセージをフラッシュするには、flash()メソッドを使用します。メッセージを取得するには、テンプレートでも使用できるget_flashed_messages()を使用できます。 完全な例については、メッセージの点滅を参照してください。


ロギング

バージョン0.3の新機能。


正しいはずのデータを処理しているが、実際には正しくない状況にある場合があります。 たとえば、サーバーにHTTPリクエストを送信するクライアント側のコードがあるかもしれませんが、それは明らかに不正な形式です。 これは、ユーザーがデータを改ざんしたか、クライアントコードが失敗したことが原因である可能性があります。 ほとんどの場合、そのような状況では400 Bad Requestで返信しても問題ありませんが、それがうまくいかず、コードが機能し続ける必要がある場合もあります。

あなたはまだ何か怪しいことが起こったことを記録したいかもしれません。 ここでロガーが役に立ちます。 Flask 0.3以降、ロガーは使用できるように事前構成されています。

ログ呼び出しの例を次に示します。

app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')

添付のloggerは標準のロギングLoggerであるため、詳細については公式のloggingドキュメントを参照してください。

アプリケーションエラーの処理を参照してください。


WSGIミドルウェアに接続する

WSGIミドルウェアをFlaskアプリケーションに追加するには、アプリケーションのwsgi_app属性をラップします。 たとえば、WerkzeugのProxyFixミドルウェアをNginxの背後で実行するために適用するには、次のようにします。

from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)

appの代わりにapp.wsgi_appをラップすると、appはミドルウェアではなくFlaskアプリケーションを指すため、引き続きappを直接使用および構成できます。 。


Flask拡張機能の使用

拡張機能は、一般的なタスクを実行するのに役立つパッケージです。 たとえば、Flask-SQLAlchemyは、Flaskで簡単に使用できるSQLAlchemyサポートを提供します。

Flask拡張機能の詳細については、拡張機能を参照してください。


Webサーバーへのデプロイ

新しいFlaskアプリをデプロイする準備はできましたか? 展開オプションを参照してください。