aiohttp 简单记录

  1. 使用 WebSockets
  2. http 控制器

aiohttp 中文文档:https://hubertroy.gitbooks.io/aiohttp-chinese-documentation/content/

loop = asyncio.get_event_loop()
app = web.Application()
app['websockets'] = []
app.router.add_route('GET', '/ws', websocket_handler)  # WebSockets 控制器
app.router.add_route('POST', '/sync', sync)
app.router.add_route('POST', '/subscribe', subscribe)  # 需要 POST 和 GET 方法,可以定义两个控制器
app.router.add_route('GET', '/subscribe', subscribe)
srv = loop.create_server(app.make_handler(), '', 8080)
print("Server start at at 8080")

loop.run_until_complete(srv)
loop.run_forever()

使用 WebSockets

async def websocket_handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)

    SerialNo = request.query.get('SerialNo')  # 从 url 中获得参数
    wsInfo = (ws, cameraid, cameraname)
    request.app['websockets'].append(wsInfo)  # 将连接信息存入 app['websockets']
    try:
        async for msg in ws:
            if msg.type == WSMsgType.TEXT:
                print(msg.data)
                if msg.data == 'ping':
                    await ws.send_bytes('pong'.encode('utf-8'))  # 向客户端发送数据
             elif msg.type == WSMsgType.CLOSE:
                await ws.close()
                logging.warning('websocket connection closed, SerialNo: {}'.format(SerialNo))
    finally:
        request.app['websockets'].remove(wsInfo)

    return ws

从另一个线程中向客户端发送 WebSocket 数据,注意需要 asyncio.new_event_loop()

https://stackoverflow.com/questions/46727787/runtimeerror-there-is-no-current-event-loop-in-thread-in-async-apscheduler/46750562#46750562

async def employeeSync(ws, cameraid):
    await ws.send_bytes('pong'.encode('utf-8'))


class employeeSyncThread (threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        syncList = []
        for webs in app['websockets']:
            ws, cameraid, cameraname = webs
            syncList.append(employeeSync(ws, cameraid))
        if syncList:
            syncLoop = asyncio.new_event_loop()
            asyncio.set_event_loop(syncLoop)
            # syncLoop = asyncio.get_event_loop()
            syncRes = syncLoop.run_until_complete(asyncio.wait(syncList))
            syncLoop.close()

http 控制器

async def subscribe(request):
    if request.method == 'POST':  # 判断请求方法
        data = await request.post()  # 接收表单提交数据
        data = await request.json()  # 接收 json 数据
        syntype = data.get("syntype")
        SerialNo = request.query['SerialNo']  # url 参数,?SerialNo=111

    return web.json_response({'msg': 'ok'})  # 返回 json

    text = '测试'
    return web.Response(text=text)  # 返回文本

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:aiohttp 简单记录

文章字数:411

本文作者:Bin

发布时间:2019-10-11, 17:05:03

最后更新:2019-10-11, 17:27:15

原始链接:http://coolview.github.io/2019/10/11/Python/aiohttp%20%E7%AE%80%E5%8D%95%E8%AE%B0%E5%BD%95/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录