0

私は現在、レガシーpythonフレームワーク(webware 0.8.1)を削除し、その上にcherrypy3.1.2をレイヤー化しようとしています。すべてのウェブウェアページをcherrypyページに変換するのではなく、単にウェブウェアを介して処理し、そのようにcherrypyに渡すだけです。

def default(self, url, *suburl, **kwarg):    
  ...snip...
  strmout = DispatcherIO()
  request = HTTPRequest(local_req)
  transaction = self.create_transaction(request)
  response = self.create_response(transaction, strmout)
  transaction.setServlet(servlet)
  transaction.awake()
  transaction.respond()
  return str(strmout)

これは、POSTが含まれていないすべてのページで正常に機能します。しかし、ログインなどの投稿を含むページでは、cherrypyは次の場所でハングします。

request = HTTPRequest(local_req)

これにより、親のcgi.FieldStorageのコンストラクターを呼び出すFieldStorageが呼び出されます。これが最終的にハングする場所です。

ただし、ターミナルでctrl-cを押すと、処理が続行され、ページが正常に読み込まれた後に終了します。したがって、ログインページで[ログイン]をクリックするとハングし、ターミナルでctrl-cを押してログインし、cherrypyをシャットダウンします。

クイックスタートの代わりにcherrypy.engine.startを使用すると、シグナルハンドラーが開始されないことがわかりました。この場合に何が起こるかは、以前の動作と同様の結果になりますが、cherrypyは実行を継続します。

この問題の原因は何ですか?助けていただければ幸いです。乾杯。

4

1 に答える 1

2

私は実際にはWebwareの経験がありませんが、コードの外観に基づいて、Webwareはcgi.FieldStorageを使用してフィールド変数を取得しようとしていますが、FieldStorageが長さを取得できないか、長さが正しく取得されていません(おそらくContent-Lengthヘッダーを取得するためにWebwareが行うことは、CherryPy WSGI環境では機能しません。デフォルトの実装はHTTP_CONTENT_LENGTH環境変数を取得し、Webwareはおそらく同様にハッキーなことを行うため、読み取りを行ってからハングします。CGIを使用しているときに、同様の問題が頻繁に発生しました。

最善の解決策は、cgi.FieldStorageを使用しないことです。問題のHTTPRequestオブジェクトがWebwareからのものである場合、サイトをCherryPy(または他のWebフレームワーク)に完全に移植するか、ネイティブ環境でWebwareを使用することをお勧めします。何かをハッキングすることは可能かもしれませんが、WSGIは独自のアプリケーションサーバーのWebwareのネイティブ環境とは大きく異なります。

于 2010-01-06T03:40:23.930 に答える