2013-05-18 4 views
6

Есть ли способ использования Websockets в Pyramid с использованием Python 3. Я хочу использовать его для живых обновляющих таблиц при изменении данных на сервере.Использование Websocket в Pyramid с использованием Python3

Я уже думал об использовании длинного опроса, но я не думаю, что это лучший способ.

Любые комментарии или идеи?

+0

Не уверен WebSocket в Python 3 (GEvent-socketio опирается на GEvent, что я не уверен, что поддерживается в Python 3). Но вы считаете, что события, отправленные сервером? Пример: https://github.com/antoineleclair/zmq-sse-chat/blob/master/sse/views.py –

ответ

3

https://github.com/housleyjk/aiopyramid работает для меня. Смотрите документацию для WebSocket http://aiopyramid.readthedocs.io/features.html#websockets

UPD:

WebSocket сервер с пирамидальной среде.

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 клиент:

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

Вы сейчас используете aiopyramid? Это стабильно? – Infernion

+0

@ Infernion Он отлично работает, но в новом проекте я использую aiohttp для websocket – uralbash

+0

, вы используете только голый aiohttp без пирамиды? – Infernion

Смежные вопросы