2013-05-18 13 views
6

Czy istnieje sposób użycia Websockets w Pyramid przy użyciu Pythona 3. Chcę go używać do aktualizowania na bieżąco tabel, gdy są zmiany danych na serwerze.Używanie Websocket w Pyramid przy użyciu Python3

Już myślałem o użyciu długiego głosowania, ale nie sądzę, że jest to najlepszy sposób.

Wszelkie uwagi lub pomysły?

+0

Nie jestem pewien websocket w Pythonie 3 (gevent-socketio polega na gevent, których nie jestem pewien jest obsługiwana w Pythonie 3). Ale czy brałeś pod uwagę zdarzenia wysłane przez serwer? Przykład: https://github.com/antoineleclair/zmq-sse-chat/blob/master/sse/views.py –

Odpowiedz

3

https://github.com/housleyjk/aiopyramid dla mnie. Zobacz dokumentację dla websocket http://aiopyramid.readthedocs.io/features.html#websockets

UPD: serwer

websocket ze środowiskiem piramidy.

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 klient:

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

Czy obecnie używasz aiopyramidu? Jest stabilny? – Infernion

+0

@Infernion Działa dobrze, ale w nowym projekcie używam aiohttp do websocket – uralbash

+0

używasz tylko nagiego aiohttp bez piramidy? – Infernion

Powiązane problemy