1

Tornado Webserver を使用しており、RequestHandler から WebSocketHandler を内部的に呼び出したいと考えています。

呼び出す WebSocketHandler クラス (以下の例では「IndexHandlerDynamic1」) が classFactory で作成されるため、リダイレクト /redirectHandler 機能を使用することはできません。

Requesthandler ( here ) の定義を使用すると、私の例は次のようになります。

class IndexHandlerDynamic1(tornado.web.WebSocketHandler):
    def initialize(self):
        print "Forwarded to Websocket"
    def open(self):
        print "WebSocket opened"
class IndexHandlerDistributor(tornado.web.RequestHandler):
    def get(self, channelId):
        IndexHandlerDynamic1(self.application, self.request)

関連する URL を要求すると、彼は IndexHandlerDistributor にジャンプし、IndexHandlerDynamic1.initialize() が呼び出されます。

ただし、クライアント側では、ブラウザ コンソールは次のエラーを出力します。

Error during WebSocket handshake: Unexpected response code: 200 

明らかに、ソケット接続が正しく開かれていません。私の間違いは何ですか?

編集:

助けてくれたベンに感謝!

悲しいことに、動的に作成された URL パラメータのような名前のクラスにユーザーをルーティングするのにまだ問題があります。私の例を見て、私の問題を理解していただければ幸いです。

app = tornado.web.Application( 
        [(r"/", IndexHandler)] + 
        [(r"/channel/(?P<channelId>[^\/]+)?", ClassFactory(channelId))] 
        ) 

Requesthandler としての ClassFactory の呼び出しのパラメーターとして channelId を使用する方法は?

または、アプリケーションの実行中にアプリケーションのルーティングを動的に変更する別の方法がありますか? もしそうなら、私はこの方法を使用して最初のタスクを解決できます。

4

1 に答える 1

0

問題は、同じリクエストに 2 つの RequestHandler をアタッチしていることです。ハンドラー クラスを動的に作成することが良いアイデアかどうかはわかりませんが、そうしたい場合は、ファクトリ関数 (それ自体は RequestHandler ではない) を URL ルーティング テーブルに渡すだけです。ルーティング テーブルは、必ずしも RequestHandler サブクラスを必要とするわけではなく(app, request)、RequestHandler インスタンスで呼び出して返すことができるオブジェクトが必要なだけです。

于 2014-07-30T19:02:12.030 に答える