フラスコ request.args.get

Salman Mehmood 2023年6月21日
フラスコ request.args.get

この説明で、request.args.get の操作方法を学びます。 また、Flask で request オブジェクトとその属性を使用するときにエラーが発生する可能性のある方法についても学習します。

request.args.get を使用して Flask でクエリ文字列を取得する

リクエストでクライアントの情報が必要な場合は、Flask モジュールの一部である request 変数を使用します。 これは、引数を取らないビュー関数であることがわかります。 アプリケーションのルートに接続されているだけです。

この request 変数はグローバル変数のように見えますが、そうではありません。 Flask からインポートされます。

これがマルチスレッド アプリケーションで、2つの要求が異なるクライアントから同時に受信された場合はどうなりますか? 関数は 2つの異なるスレッドで同時に実行され、両方とも参照要求を使用しています。

from flask import Flask, request

app = Flask(__name__)
app.config["SECRET_KEY"] = "NO_SECRETS"


@app.route("/")
def Main_Page():
    Employee_Name = request.args.get("name")

    return "<h2>Hello {}</h2>".format(Employee_Name)


if __name__ == "__main__":
    app.run(debug=True)

各スレッドは正しい request オブジェクトを取得します。 しかし、これは多くの混乱を引き起こし、多くの人はそれがどのように機能するかを理解していません.

Flask で request オブジェクトを使用するときにエラーが発生する可能性のある方法

人々が非常にあいまいなエラーを経験し、時々何が起こっているのか誰も理解していない例をいくつか示します。 Python シェルを開きます。Flask から request をインポートすれば問題ありません。

request.args.get() を使用して http://127.0.0.1:5000/?name=jack を使用して URL のクエリ文字列からアイテムを取得し、Flask request オブジェクトがコンソール内にある場合、Working outside of request context という有名なエラーが発生します。 これは、このエラーが発生する 1つの方法です。

>>> from flask import Flask ,request
>>> request.args.get('name')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\python\lib\site-packages\werkzeug\local.py", line 432, in __get__
    obj = instance._get_current_object()
  File "C:\python\lib\site-packages\werkzeug\local.py", line 554, in _get_current_object
    return self.__local()  # type: ignore
  File "C:\python\lib\site-packages\flask\globals.py", line 33, in _lookup_req_object
    raise RuntimeError(_request_ctx_err_msg)
RuntimeError: Working outside of request context.

This typically means you attempted to use functionality that needed
an active HTTP request. Consult the documentation on testing for
information about how to avoid this problem.

Flask がクライアントからリクエストを受信していて、ビュー関数を呼び出す必要があるとします。 Web ブラウザが提供する情報を受け取り、request オブジェクトを作成します。

リクエスト コンテキストは、Flask が維持する構造です。 スレッドごとに 1つの要求コンテキストを維持します。

各スレッドは異なるリクエスト コンテキストを持ちます。 そのリクエストのリクエストオブジェクトをコンテキストに配置します。 コンテキストはオブジェクトのリストであるデータ構造であり、新しいリクエストが到着すると、Flask はビュー関数を呼び出します。

属性にアクセスしようとするたびに、Flask はビュー関数を呼び出して、クライアント リクエストにマップされるそのリクエスト オブジェクトを呼び出します。 各スレッドには異なる要求コンテキスト構造があるため、各スレッドは独自のサーバーを取得します。

ビュー関数から request.args を使用すると、プロキシがアクティブになり、このスレッドのリクエスト コンテキストに保存されている request オブジェクトが表示されます。 もちろん、アプリケーションを実行していないため、そのようなことはありません。 そのため、リクエストを受け付けていません。

この場合、Flask は、存在しないリクエスト コンテキストから request オブジェクトを取得するように求めていることを検出します。 フラスコ アプリケーションを実行し、URL エンドポイントから request.args.get() を使用して文字列クエリにアクセスしようとすると、次のようになります。

Flask request.args.get 出力

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn