25

通常のボトル ​​アプリケーションと WebSocket アプリケーション (例: https://github.com/defnull/bottle/blob/master/docs/async.rst ) を同じアプリケーション (同じポート) でホストすることは可能ですか? そのため、/ws は WebSocket ハンドラーに移動し、他のすべては通常、他のボトル ​​ハンドラーにルーティングされます。

4

2 に答える 2

22

確かにそうです。

サーバー:

#!/usr/bin/python

import json
from bottle import route, run, request, abort, Bottle ,static_file
from pymongo import Connection
from gevent import monkey; monkey.patch_all()
from time import sleep

app = Bottle()

@app.route('/websocket')
def handle_websocket():
    wsock = request.environ.get('wsgi.websocket')
    if not wsock:
        abort(400, 'Expected WebSocket request.')
    while True:
        try:
            message = wsock.receive()
            wsock.send("Your message was: %r" % message)
            sleep(3)
            wsock.send("Your message was: %r" % message)
        except WebSocketError:
            break

@app.route('/<filename:path>')
def send_html(filename):
    return static_file(filename, root='./static', mimetype='text/html')


from gevent.pywsgi import WSGIServer
from geventwebsocket import WebSocketHandler, WebSocketError

host = "127.0.0.1"
port = 8080

server = WSGIServer((host, port), app,
                    handler_class=WebSocketHandler)
print "access @ http://%s:%s/websocket.html" % (host,port)
server.serve_forever()

javascript を保持する html ページ:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <script type="text/javascript">
    var ws = new WebSocket("ws://localhost:8080/websocket");
    ws.onopen = function() {
        ws.send("Hello, world");
    };
    ws.onmessage = function (evt) {
        alert(evt.data);
    };
  </script>
</head>
<body>
</body>
</html>

クライアント:

#!/usr/bin/python

from websocket import create_connection
ws = create_connection("ws://localhost:8080/websocket")
print "Sending 'Hello, World'..."
ws.send("Hello, World")
print "Sent"
print "Reeiving..."
result =  ws.recv()
print "Received '%s'" % result
ws.close()
于 2012-06-19T16:53:55.153 に答える
5

これはおそらく最も簡単な答えではありませんが、Pyramid で Nginx と uWSGI を使用して動作するテスト環境のセットアップを完了しました。セットアップが完了したら、非常に簡単に拡張できます。たとえば、/ws がプルするリソースが多すぎる場合、Nginx + uWSGI を使用して /ws を別のハードウェアに再配置するのは簡単です。私のバックグラウンドは Pyramid であり、uWSGI の経験はテストのみでしたが、私の読書ではうまく機能するはずのソリューションのようです。ボトルの説明書は、簡単な Google 検索の結果でした。

コンセプト:

コンセプトは、 app.serve_forever()呼び出しの前に アプリ、つまりapp = make_wsgi_app.from_config(config)を取得し、代わりに uwsgi を使用してアプリをソケットapp1.sockに「提供」することです。uWSGI を構成するには多くの方法があります。uWSGI サイトには、アプリと通信するように uWSGI を構成するその他の方法に関するドキュメントがあります。Nginx には、少なくとも現在のバージョンで uWSGI ソケットをネイティブに使用するための構成が付属しています。uwsgi_pass unix:///tmp/app1.sock;を渡すだけです。パラメータとともにサイト構成へのパス。これを同じサイト conf ファイルで 2 回実行します。1 回は場所 / {で、もう 1 回は場所 /ws {で、それぞれのアプリ sock ファイルを指していれば、準備完了です。

アプリをファイルとしてソケットに提供するという概念は、テスト環境をセットアップしていたときに初めて知ったものでした。これが役立つことを願っています。

取得するもの:

nginx
uWSGI

方法:

このチュートリアル から nginx と uwsgi のセットアップ情報を引き出して、アプリに合わせます。ボトル固有のセットアップについては、こちらを参照するか、uwsgi サイトにアクセスして、構成手順を確認してください。特定の技術ごとのドキュメントは非常に優れているため、組み合わせた例がなくても、それらを組み合わせて動作させることは難しくありませんでした. Nginx と uWSGI の両方で膨大な数の構成設定があるため、それらも確認してください。

于 2012-05-14T22:21:41.297 に答える