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

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

クイックスタート

始めたいですか? このページでは、Flaskの概要を説明しています。 すでにFlaskがインストールされていることを前提としています。 そうでない場合は、インストールセクションに進んでください。

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

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

from flask import Flask
app = Flask(__name__)

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

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

  1. まず、Flaskクラスをインポートしました。 このクラスのインスタンスは、WSGIアプリケーションになります。
  2. 次に、このクラスのインスタンスを作成します。 最初の引数は、アプリケーションのモジュールまたはパッケージの名前です。 (この例のように)単一のモジュールを使用している場合は、__name__を使用する必要があります。これは、アプリケーションとして起動するか、モジュールとしてインポートするかによって、名前が異なるためです('__main__'と実際のモジュール)。インポート名)。 これは、Flaskがテンプレートや静的ファイルなどを探す場所を知るために必要です。 詳細については、Flaskのドキュメントを参照してください。
  3. 次に、route()デコレータを使用して、関数をトリガーするURLをFlaskに指示します。
  4. 関数には、その特定の関数のURLを生成するためにも使用される名前が付けられ、ユーザーのブラウザーに表示するメッセージを返します。

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

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

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/

Windowsを使用している場合、環境変数の構文はコマンドラインインタープリターによって異なります。 コマンドプロンプトの場合:

C:\path\to\app>set FLASK_APP=hello.py

そしてPowerShellの場合:

PS C:\path\to\app> $env:FLASK_APP = "hello.py"

または、 python-mフラスコを使用することもできます。

$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/

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

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 スクリプトは、ローカル開発サーバーを起動するのに適していますが、コードを変更するたびに手動で再起動する必要があります。 それはあまり良くありませんし、Flaskはもっとうまくいくことができます。 デバッグサポートを有効にすると、サーバーはコードの変更時に自身をリロードし、問題が発生した場合に役立つデバッガーも提供します。

すべての開発機能(デバッグモードを含む)を有効にするには、サーバーを実行する前に、FLASK_ENV環境変数をエクスポートし、developmentに設定します。

$ export FLASK_ENV=development
$ flask run

(Windowsでは、exportの代わりにsetを使用する必要があります。)

これは次のことを行います。

  1. デバッガーをアクティブにします
  2. 自動リローダーをアクティブにします
  3. Flaskアプリケーションでデバッグモードを有効にします。

FLASK_DEBUG=1をエクスポートすることにより、環境とは別にデバッグモードを制御することもできます。

開発サーバーのドキュメントで説明されているパラメータは他にもあります。

注意

対話型デバッガーはフォーク環境では機能しませんが(本番サーバーでの使用はほぼ不可能になります)、任意のコードを実行できます。 これは重大なセキュリティリスクとなるため、本番マシンで使用してはなりません。


動作中のデバッガーのスクリーンショット:

class=screenshot align-center|screenshot of debugger in action デバッガーの使用の詳細については、 Werkzeugのドキュメントを参照してください。

別のデバッガーを念頭に置いていますか? デバッガーの操作を参照してください。


ルーティング

最新の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>のような引数のタイプを指定できます。

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % 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 'Post %d' % post_id

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    # show the subpath after /path/
    return 'Subpath %s' % 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にアクセスすると、Flaskは末尾にスラッシュを付けた正規URLにリダイレクトします。

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


URL構築

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

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

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

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

from flask import Flask, escape, url_for

app = Flask(__name__)

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

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

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

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 %}

テンプレート内では、リクエストセッションg 1 オブジェクト、およびget_flashed_messages()関数にもアクセスできます。 。

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

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

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

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

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


1
その g オブジェクトが何であるかわからないですか? 自分のニーズに合わせて情報を保存できるものです。詳細については、そのオブジェクトのドキュメント( g )および SQLite3とFlaskの使用を確認してください。


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

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()メソッドに渡すことです。

from flask import request

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 flask import request
from werkzeug.utils import secure_filename

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('/var/www/uploads/' + secure_filename(f.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を使用して応答オブジェクトに変換されます。 Flaskが戻り値を応答オブジェクトに変換するために適用するロジックは次のとおりです。

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

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

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

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

戻り式を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

セッション

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

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

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

# 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 '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'))

ここで説明するescape()は、(この例のように)テンプレートエンジンを使用していない場合にエスケープします。

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

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

$ python -c 'import os; print(os.urandom(16))'
b'_5#y2L"F4Q8z\n\xec]/'

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アプリをデプロイする準備はできましたか? 展開オプションに移動します。