aiohttp 简单记录
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()
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" 转载请保留原文链接及作者。