zoukankan      html  css  js  c++  java
  • 【笔记】:aiohttp搭建简易聊天室

     简易聊天室:

    1、入口main.py

    import logging
    
    import jinja2
    
    import aiohttp_jinja2
    from aiohttp import web
    from aiohttpdemo_chat.views import index
    
    
    async def init_app():
    
        app = web.Application()
    
        app['websockets'] = {}
    
        app.on_shutdown.append(shutdown)
    
        aiohttp_jinja2.setup(
            app, loader=jinja2.PackageLoader('aiohttpdemo_chat', 'templates'))
    
        app.router.add_get('/', index)
    
        return app
    
    
    async def shutdown(app):
        for ws in app['websockets'].values():
            await ws.close()
        app['websockets'].clear()
    
    
    def main():
        # logging.basicConfig(level=logging.INFO)
        logging.basicConfig(level=logging.INFO,
                            format="%(asctime)s  [%(filename)s:%(lineno)d] %(message)s", datefmt="%m/%d/%Y %H:%M:%S [%A]")
    
        app = init_app()
        web.run_app(app)
    
    
    if __name__ == '__main__':
        main()
    

     

    2、业务views.py

    import logging
    
    import aiohttp
    import aiohttp_jinja2
    from aiohttp import web
    from faker import Faker
    
    log = logging.getLogger(__name__)
    
    
    def get_random_name():
        fake = Faker()
        return fake.name()
    
    
    async def index(request):
        ws_current = web.WebSocketResponse()
        ws_ready = ws_current.can_prepare(request)
        if not ws_ready.ok:
            return aiohttp_jinja2.render_template('index.html', request, {})
    
        await ws_current.prepare(request)
    
        name = get_random_name()
        log.info('%s joined.', name)
    
        await ws_current.send_json({'action': 'connect', 'name': name})
    
        for ws in request.app['websockets'].values():
            await ws.send_json({'action': 'join', 'name': name})
        request.app['websockets'][name] = ws_current
    
        while True:
            msg = await ws_current.receive()
            logging.info(msg.type)
            if msg.type == aiohttp.WSMsgType.text:
                for ws in request.app['websockets'].values():
                    if ws is not ws_current:
                        await ws.send_json(
                            {'action': 'sent', 'name': name, 'text': msg.data})
            else:
    
                break
    
        del request.app['websockets'][name]
        log.info('%s disconnected.', name)
        for ws in request.app['websockets'].values():
            await ws.send_json({'action': 'disconnect', 'name': name})
    
        return ws_current
    

      

     展示:

    引用-https://github.com/lianzhilei/aiohttp-demos/tree/master/demos/chat

  • 相关阅读:
    WIndows系统下mysql-noinstall安装配置
    Java compiler level does not match the version of the installed Java project facet.
    定时执行程序-Quartz简单实例
    win7安装ruby on rails
    ajax提交数据问题
    js打开新的链接下载文件
    Spring 3.2 ClassMetadataReadingVisitor 错误
    eclipse 错误: 找不到或无法加载主类
    sts 去掉启动的rss功能
    解决多线程下simpleDateFormat的安全问题
  • 原文地址:https://www.cnblogs.com/lianzhilei/p/10524011.html
Copyright © 2011-2022 走看看