3

aiohttp+aiomysql で遊んでいます。リクエスト呼び出し間で同じ接続プール インスタンスを共有したい。

そのため、グローバル var を作成し、corouting 呼び出しで一度 preinit します。

私のコード:

import asyncio
from aiohttp import web
from aiohttp_session import get_session, session_middleware
from aiohttp_session.cookie_storage import EncryptedCookieStorage
from aiohttp_session import SimpleCookieStorage
#from mysql_pool import POOL
from aiomysql import create_pool

M_POOL = None

async def get_pool(loop):
    global M_POOL
    if M_POOL: return M_POOL
    M_POOL = await create_pool(host='127.0.0.1', port=3306, user='user', password='user', db='test', loop=loop)
    return M_POOL


async def query(request):
    loop = asyncio.get_event_loop()
    pool = await get_pool(loop)

    print(id(pool))
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            await cur.execute("SELECT 42;")
            value = await cur.fetchone()
            print(value)

    return web.Response(body=str.encode(str(value)))


app = web.Application(middlewares=[session_middleware(SimpleCookieStorage())])
app.router.add_route('GET', '/query', query)


web.run_app(app)

これを行うのは便利な方法ですか、それとももっと良い方法でしょうか?

4

2 に答える 2

2

グローバル変数の使用は強くお勧めしません。

標準的なアプローチについては、 aiohttp デモをご覧ください。

SiteHandlerは、Web サイトのビューを実装するクラスです。

于 2016-07-06T10:16:45.173 に答える