8

ユーザーが/fooサーバーでリクエストを送信すると、次の HTTP レスポンスを送信します (接続を閉じません)。

Content-Type: multipart/x-mixed-replace; boundary=-----------------------

-----------------------
Content-Type: text/html

<a href="/bar">foo</a>

ユーザーが/bar204 No Contentビューが変更されないように送信されます)に移動すると、最初の応答で次のデータを送信したいと思います。

-----------------------
Content-Type: text/html

bar

最初の応答からこれをトリガーする 2 番目の要求を取得するにはどうすればよいですか? 私はおそらく楽しみのために、JavaScript なしでサーバー プッシュと Ajax 効果を行うファンシーな [multipart/x-mixed-replace (現在は Gecko のみ) をサポートするエンジン] 専用の電子メール Web アプリケーションを作成することを計画しています。

4

4 に答える 4

1

私はいくつかの小さな例を作成しました(ただ楽しみのために、あなたは知っています:))

import threading

num = 0
cond = threading.Condition()

def app(environ, start_response):
    global num

    cond.acquire()
    num += 1
    cond.notifyAll()
    cond.release()

    start_response("200 OK", [("Content-Type", "multipart/x-mixed-replace; boundary=xxx")])
    while True:
        n = num    
        s = "--xxx\r\nContent-Type: text/html\r\n\r\n%s\n" % n
        yield s
        # wait for num change:
        cond.acquire()
        while num == n:
            cond.wait()
        cond.release()


from cherrypy.wsgiserver import CherryPyWSGIServer
server = CherryPyWSGIServer(("0.0.0.0", 3000), app)

try:
    server.start()
except KeyboardInterrupt:
    server.stop()

# Now whenever you visit http://127.0.0.1:3000/, the number increases.
# It also automatically increases in all previously opened windows/tabs.

共有変数とスレッド同期(条件変数オブジェクトを使用)の考え方は、CherryPyWSGIServerによって提供されるWSGIサーバーがスレッド化されているという事実に基づいています。

于 2010-04-20T15:16:46.973 に答える
1

問題が /bar アプリケーションから /foo アプリケーションに何らかのコマンドを渡すことであり、サーブレットのようなアプローチを使用している場合 (CGI のように要求ごとにではなく、Python コードが 1 回読み込まれる)、いくつかのクラス プロパティを変更するだけで済みます。 /foo アプリケーションにアクセスし、/foo インスタンスの変更に対応できるようにします (プロパティの状態を確認することにより)。

明らかに、/foo アプリケーションは、最初のリクエストの直後に戻って、行ごとにコンテンツを生成するべきではありません。

これは単なる理論だと思ったので、自分で試したことはありません。

于 2010-04-05T08:50:01.353 に答える
1

完全な答えはありませんが、次のとおりです。

あなたの質問では、Cometスタイルのアーキテクチャについて説明しています。Python/WSGI での Comet スタイル技術のサポートに関しては、StackOverflow questionがあります。これは、Comet の長時間実行リクエストをサポートするさまざまな Python サーバーについて説明しています。

Python Web-SIG の次のメール スレッドも興味深いものです。「WSGI は非同期応答を処理できますか?」. 2008 年 5 月に、Web-SIGで WSGI の非同期リクエストのトピックについて幅広い議論が行われました。

最近開発されたのは、2008 年 5 月に Web-SIG で Christopher Stawarz によって提案された非同期 WSGI 拡張機能を実装する軽量 WSGI サーバーであるevserverです。

最後に、Tornado Web サーバーはノンブロッキング非同期リクエストをサポートしています。ロング ポーリングを使用したチャット サンプル アプリケーションがあり、要件と類似しています。

于 2010-04-20T14:23:21.453 に答える
-1

これがあなたが探しているものかどうかはわかりませんが、multipart/x-mixed-replace の MIME コンテンツを使用してサーバー プッシュを行うかなり古い方法があります。

基本的に、コンテンツ タイプが multipart/x-mixed-replace の MIME オブジェクトとして応答を作成し、ドキュメントの最初の「バージョン」を送信します。ブラウザはソケットを開いたままにします。

次に、サーバーがさらにデータをプッシュすることを決定すると、ドキュメントの新しい「バージョン」がサーバーから送信され、ブラウザーは (コンテンツを含むフレーム/iframe 内で) コンテンツをインテリジェントに置き換えます。

これは、サーバーが次から次へと画像を送信 (プッシュ) し、ブラウザがドキュメント内の画像を何度も置き換え続ける Web カメラの初期の方法でした。これは、単一の HTTP リクエストで「読み込み中...」メッセージを送信する方法でもあります。

于 2010-04-05T16:40:28.990 に答える