2013-05-18 8 views
6

Gibt es eine Möglichkeit, Websockets in Pyramid mit Python 3 zu verwenden. Ich möchte es für Live-Aktualisierung Tabellen verwenden, wenn Datenänderungen auf dem Server sind.Verwenden von Websocket in Pyramid mit Python3

Ich dachte schon an Long-Polling, aber ich denke nicht, dass dies der beste Weg ist.

Irgendwelche Kommentare oder Ideen?

+0

Nicht sicher websocket in Python 3 (GEVENT-socketio auf GEVENT beruht, die ich nicht sicher bin, ist in Python 3 unterstützt). Aber haben Sie Server Sent Events berücksichtigt? Beispiel: https://github.com/antoineleclair/zmq-sse-chat/blob/master/sse/views.py –

Antwort

3

https://github.com/housleyjk/aiopyramid funktioniert für mich. Lesen Sie die Dokumentation für websocket http://aiopyramid.readthedocs.io/features.html#websockets

UPD:

WebSocket-Server mit Pyramide Umgebung.

import aiohttp 
import asyncio 
from aiohttp import web 
from webtest import TestApp 
from pyramid.config import Configurator 
from pyramid.response import Response 

async def websocket_handler(request): 

    ws = web.WebSocketResponse() 
    await ws.prepare(request) 

    while not ws.closed: 
     msg = await ws.receive() 

     if msg.tp == aiohttp.MsgType.text: 
      if msg.data == 'close': 
       await ws.close() 
      else: 
       hello = TestApp(request.app.pyramid).get('/') 
       ws.send_str(hello.text) 
     elif msg.tp == aiohttp.MsgType.close: 
      print('websocket connection closed') 
     elif msg.tp == aiohttp.MsgType.error: 
      print('ws connection closed with exception %s' % 
        ws.exception()) 
     else: 
      ws.send_str('Hi') 

    return ws 


def hello(request): 
    return Response('Hello world!') 

async def init(loop): 
    app = web.Application(loop=loop) 
    app.router.add_route('GET', '/{name}', websocket_handler) 
    config = Configurator() 
    config.add_route('hello_world', '/') 
    config.add_view(hello, route_name='hello_world') 
    app.pyramid = config.make_wsgi_app() 

    srv = await loop.create_server(app.make_handler(), 
            '127.0.0.1', 8080) 
    print("Server started at http://127.0.0.1:8080") 
    return srv 

loop = asyncio.get_event_loop() 
loop.run_until_complete(init(loop)) 
try: 
    loop.run_forever() 
except KeyboardInterrupt: 
    pass 

WebSocket-Client:

import asyncio 
import aiohttp 

session = aiohttp.ClientSession() 


async def client(): 
    ws = await session.ws_connect('http://0.0.0.0:8080/foo') 

    while True: 
     ws.send_str('Hi') 
     await asyncio.sleep(2) 
     msg = await ws.receive() 

     if msg.tp == aiohttp.MsgType.text: 
      print('MSG: ', msg) 
      if msg.data == 'close': 
       await ws.close() 
       break 
      else: 
       ws.send_str(msg.data + '/client') 
     elif msg.tp == aiohttp.MsgType.closed: 
      break 
     elif msg.tp == aiohttp.MsgType.error: 
      break 

loop = asyncio.get_event_loop() 
loop.run_until_complete(client()) 
loop.close() 
+0

Verwenden Sie aiopyramid für jetzt? Es ist stabil? – Infernion

+0

@Infernion Es funktioniert gut, aber in einem neuen Projekt, verwende ich aiohttp für Websocket – uralbash

+0

verwenden Sie nur Aiohttp ohne Pyramide? – Infernion