4

CherryPyアプリケーションのデバッグメソッドを書いていました。問題のコードは(非常に)基本的にこれと同等でした:

import cherrypy

class Page:
    def index(self):
        try:
            self.body += 'okay'
        except AttributeError:
            self.body = 'okay'
        return self.body
    index.exposed = True

cherrypy.quickstart(Page(), config='root.conf')

リクエストごとに、self.bodyの出力が大きくなっていることに驚きました。あるクライアントから、次に同時に開いている別のクライアントからページにアクセスし、両方のブラウザーを更新すると、出力は増え続ける「OK」の文字列でした。私のデバッグ方法では、ユーザー固有の情報(つまり、セッションデータ)も記録していましたが、それも両方のユーザーの出力に表示されました。

これは、Pythonモジュールがリクエストごとに再実行されるのではなく、作業メモリーにロードされるためだと思います。

私の質問はこれです:それはどのように機能しますか?self.debugはリクエスト間で保持されますが、cherrypy.sessionとcherrypy.responseは保持されないのはどうしてですか?

また、現在のリクエストにのみ使用されるオブジェクト属性を設定する方法はありますか?リクエストごとにself.bodyを上書きできることは知っていますが、少しアドホックなようです。CherryPyでそれを行うための標準的な方法または組み込みの方法はありますか?

(2番目の質問はCherryPyキャッシングはどのように機能しますか?に移動しました)

4

2 に答える 2

5

CherryPyを実行しているPythonプロセスのメモリ内で同じであるため、self.bodyから同じデータを取得していることを確認して頭に釘を打ちました。

self.debugはこの理由で「状態」を維持します。これは、実行中のサーバーの属性です。

現在のセッションのデータを設定するには、cherrypy.session ['fieldname'] ='fieldvalue'を使用し、データを取得するには、cherrypy.session.get('fieldname')を使用します。

あなた(プログラマー)はセッションIDを知る必要はありません。cherrypy.sessionはそれを処理します-セッションIDはcherrypyによってオンザフライで自動的に生成され、後続のクエリでブラウザーとサーバーの間でCookieを交換することによって保持されます/応答の相互作用。

構成でcherrypy.sessionのstorage_typeを指定しない場合、それはメモリに保存されます(サーバーとユーザーがアクセスできます)が、必要に応じてセッションファイルをディスクに保存することもできます。実行中のサーバーからセッションIDまたはキー/ペア値を掘り出すための一連のコードを記述せずにデバッグする方法。

詳細については、http://www.cherrypy.org/wiki/CherryPySessionsをチェックしてください。

于 2010-10-10T07:48:22.097 に答える
5

シンセサイザーパテルの分析は正しいですが、リクエストごとにデータを保存したい場合cherrypy.requestは、セッションではなく、の属性として保存してください。およびオブジェクトはリクエストごとに新しいため、それらの属性のいずれかがリクエスト間で存続する心配はありませんcherrypy.request.responseそれが標準的な方法です。チェリーピーの内部属性を上書きしていないことを確認してください。cherrypy.request.bodyたとえば、POSTされたJSONリクエスト本文などを渡すためにすでに予約されています。

スコープがどのように機能するかについてのすべての詳細については、最良のソースはソースコードです。

于 2010-10-11T18:49:36.933 に答える