0

私は、機会があればいつでも Python を学習している PHP プログラマーです。

Python Web アプリケーションは、リクエスト間でアクティブなままであると読みました。データはメモリ内にとどまり、リクエスト間で利用できるということですよね?

それがどのように機能するのか疑問に思っています。

PHP では、一意のトークンを持つ Cookie を配置し、セッションにデータを保存します。セッションは配列であり、ディスクまたはデータベースに保存されます。セッション関数のリクエスト間で、一意のトークンを持つ Cookie に基づいて正しいセッション配列を復元します。つまり、各ブラウザーは独自のセッションを取得し、セッションには事前に設定された有効期限があります。ユーザーが非アクティブで、有効期限がトリガーされた場合、セッションは消去されます。ユーザーが戻ってきたら、新しいセッションを作成する必要があります。

私の理解では、アプリケーションはリクエスト間でアクティブなままであるため、Python はこれを必要としません。

各リクエストは Python で一意のスレッドを取得しませんか?

リクエストをどのように区別しますか?リクエスタは誰ですか?

ユーザーとアプリケーションの間で変数を分離する処理方法はありますか?

dict が保存されているとしましょう。この dict は、任意のブラウザーからのすべてのリクエスト間でグローバルに利用できますか、それともその 1 つのブラウザーに対してのみ利用できますか。

メモリはいつ、どのようにクリアされますか。すべてが記憶に残るなら。アプリが再起動せずに数年間実行されている場合はどうでしょうか。ある種の有効期限設定またはメモリ処理が必要ですか?

あるコメンターは、それは Web アプリに依存すると述べています。だから、Bottle.py を使って学習しています。

4

4 に答える 4

0

答えは、Python内で使用しているWebアプリケーションフレームワークによって異なると思います。それらのいくつかには、リクエスト全体でユーザーを追跡するセッション管理部分が含まれています。ただし、httpで応答する基本的なポートリスナーがある場合は、Cookieサポートまたはセッション管理を自分で構築する必要があります。

もう1つの大きな違いは、phpでは、応答を生成するために実際のhttpサーバーが委任するモジュールがサーバーにインストールされていることです。PHPは、応答のルーティングまたは実際の提供を処理しません。一方、Pythonは実際には、応答を生成するためのサーバーおよびリソースになることができます。これは、サーバーが実行されているマシンにPythonがどのようにインストール/アクセスされているかによって異なります。その意味で、PythonWebアプリケーション内でやりたいことが何でもできます。

興味がある場合は、いくつかの利用可能なPythonWebフレームワークを確認する必要があります。

編集:bottle.pyについておっしゃっていましたが、ラピッドプロトタイピング用のマイクロフレームワークであり、必ずしも大規模なアプリケーションに適しているとは限らないため、認証とセッション管理は提供されていません(不可能ではありませんが、多くの仕事)。

于 2012-08-22T01:15:22.820 に答える
0

Twisted のWeb サーバーを使用する前に、リクエスト間で Python のオブジェクトを保持することができました。ブラウザー間で持続するかどうかを自分で確認しようとしたことはありませんが、そう感じます. ドキュメントのコード スニペットを次に示します。

Twisted には、イベント駆動型の Web サーバーが含まれています。サンプル Web アプリケーションを次に示します。リソース オブジェクトが、リクエストごとに再作成されるのではなく、メモリ内に保持されることに注意してください。

from twisted.web import server, resource
from twisted.internet import reactor

class HelloResource(resource.Resource):
    isLeaf = True
    numberRequests = 0

    def render_GET(self, request):
        self.numberRequests += 1
        request.setHeader("content-type", "text/plain")
        return "I am request #" + str(self.numberRequests) + "\n"

reactor.listenTCP(8080, server.Site(HelloResource()))
reactor.run()
于 2012-08-23T09:16:26.460 に答える
0

はいといいえ。この質問を確認すると、Django アプリケーションでどのように機能するかがわかります。

しかし、あなたがそれを述べている方法では、それはうまくいきません。次のリクエストでアクセスできるようにするために、どこかに渡さずに 1 つのリクエストで dict を定義しても、それ以降のリクエストでは明らかに利用できません。したがって、はい、これを行うオプションがありますが、すぐに使用できるわけではありません!

于 2012-08-22T01:40:23.577 に答える
0

まず第一に、Pythonのローカル変数とグローバル変数の違いと、スレッド ローカル ストレージがどのように機能するかを理解する必要があります。

これは(非常に)短い説明です:

  • グローバル変数は、モジュール スコープで宣言された変数であり、すべてのスレッドで共有されます。明示的に削除されない限り、プロセスが実行されている限り存続します
  • ローカル変数は、関数内で宣言され、その関数の呼び出しごとにインスタンス化される変数です。他の場所でまだ参照されていない限り、関数が終了すると削除されます。
  • スレッド ローカルストレージを使用すると、現在のスレッドに固有のグローバル変数を定義できます。明示的に削除されない限り、現在のスレッドが実行されている限り有効です。

そして今、私はあなたの元の質問に答えようとします (答えは bottle.py に固有のものですが、Python Web サーバーで最も一般的な実装です)

Doesn't each request get a unique thread in Python?

同時実行には個別のスレッドがあり、将来のリクエストは以前のスレッドを再利用する可能性があります。

How does it distinguish between requests, who the requester is?

bottle.py はスレッドローカルストレージを使用して現在のリクエストにアクセスします

Is there a handling method to separate vars between users and application?

を探しているようですねsession。もしそうなら、異なる実装には長所と短所があるため、標準的な方法はありません。たとえば、これはセッション用の bottle.py ミドルウェアです。

dict が保存されているとしましょう。この dict は、任意のブラウザーからのすべてのリクエスト間でグローバルに使用できますか、それともその 1 つのブラウザーに対してのみ使用できますか。メモリがクリアされるタイミングと方法。

すべてが記憶に残るなら。アプリが再起動せずに数年間実行されている場合はどうでしょうか。ある種の有効期限設定またはメモリ処理が必要ですか?

まさに、有効期限の設定があるはずです。カスタム dict を使用しているため、dict の各エントリの有効期限をチェックするタイマーが必要です。

于 2012-08-23T10:15:59.980 に答える