私はaiohttp + aiomysqlで遊んでいます。私は要求呼び出しの間に同じ接続プールのインスタンスを共有したい。aiohttp + aiomysql(python 3.5)のシングルトン接続プール
だから私はグローバル変数を作成し、それをcoroutingコールで一度前倒しします。
マイコード:
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)
はそれがこれを行うにconvinientの方法である、またはより良いものになるかも?
同様の質問の別の答えを見つけてください。 https://github.com/aio-libs/aiohttp/issues/2495 あなたは「request.appを伝播する - 技術的には、インポート時にアプリを取得するのと同じレベルの醜さです」と言いました。 グローバルは存在しないので、伝播はありません.... それではどのように??? ... –