単純なアプリのデータ ストアとしてテキスト ファイルを使用することを回避できるかどうか疑問に思っているので、質問します。各ハンドラーが最後まで実行された場合、各リクエストの最後にファイルを閉じると仮定すると、競合を心配することなく、そのリクエスト中にテキスト ファイルを変更できるはずです。
これは実現可能ですか?Flask アプリでテキスト ファイルをデータ ストアとして使用するために何か特別なことが必要ですか?
結局、Flask アプリケーションはWSGIアプリケーションです。つまり、これは次のような単純な Python 関数です...
def simple_app(environ, start_response):
# environ is a dict, start_response is a callable.
# This function should call start_response, then return an iterable of strings
# that make up the body of the response.
Flask は、flask パッケージ内の他の関数の束を呼び出す方法でこの関数を実装し、最終的に制御をユーザーに渡します。それまでにデータ構造は変更されていますが、プロセス全体は、この 1 つの関数を正しく実装するコードを簡単に作成する方法にすぎません。
この関数は Web サーバーによって呼び出されます (Apache のmodwsgiモジュールなどのモジュールを使用する場合もあります)。もちろん、この 1 つの大関数を呼び出すには、Python のインスタンスにロードする必要があります。
Web サーバーに wsgi モジュールがあるとします。Web サーバーが起動すると、モジュールは最大 4 つのスレッドを持つ単一の Python プロセスを作成します。新しいリクエストが来ると、未使用のスレッドの 1 つを取得し、上記の関数を呼び出します。次に、Flask の残りのすべてとアプリケーションのコードが、そのスレッド内で呼び出されます。ただし、別のリクエストは同じ関数を呼び出しますが、現在は別のスレッドにあります。これが機能する理由は、Flask がそのようなマルチスレッド モードでの実行を明示的に可能にしたためですが、Flask は実際には複数のスレッドで実行されるかどうかを制御しません。もちろん、1 つのプロセスと 4 つのスレッドは完全に恣意的です。サーバーは、複数のプロセスとそれぞれ 12 個のスレッドを使用することができます。または、1 つのプロセスと 1 つのスレッド。
つまり、Flask は WSGI プロトコルを使用して作成された単なるアプリであるため、本当の答えは Flask とは何の関係もありません。マルチスレッド状態に関する WSGI プロトコルの決定...
スレッドのサポート、またはその欠如もサーバーに依存します。複数のリクエストを並行して実行できるサーバーは、アプリケーションをシングルスレッドで実行するオプションも提供する必要があります。これにより、スレッドセーフではないアプリケーションやフレームワークをそのサーバーで引き続き使用できるようになります。
そのため、本当に Flask アプリケーションをシングルスレッド モードで実行したい場合は、WSGI アプリケーションがどのように実行されるかについて、特定のサーバーやモジュールを確認する必要があります。サーバー/モジュールには、おそらく、アプリケーションを単一のスレッドで実行するように構成する方法があります。
シングル スレッド システムを強制し、アイテムをテキスト ファイルに格納することが適切かどうかについては、かなり主観的です。
その保証がないことは確かです。ただし、アプリケーションの実行方法によって異なります。たとえば、Heroku+gunicorn を使用している場合、リクエスト中に変更された Heroku 上のすべてのファイルは保持されません。つまり、ファイルは一時的なものです。そのため、テキスト ファイルを変更すると、その変更は次のリクエストまで保持されません。別のプロバイダーである PythonAnywhere は、ファイルシステムに関してそれほど厳密ではありませんが、要求が次の開始前に終了するという保証はありません。さらに、最新の Web サーバーの場合、これは役に立たないアプリケーション (より正確にはサーバー) になります。
また、小さなデータベースが必要な場合は、sqlite を使用してください。システムにインストールされている限り、Pythonにはそれと対話するためのライブラリが付属しています(私の記憶が正しければ)。