Форум сайта python.su
Если все в одном месте (исключая tornado) то все просто + есть примеры. Но когда надо разбить по папкам (создать слоистую структуру), то много вопросов:
Так например есть слои BLL(Service), DAL(Connector, Repository), WebApi(Api,Run)
Пример без слоев для DAL:
conn = await aiomysql.connect(host=config.get('DataBase', 'host'), port=3306, user=config.get('DataBase','user'), password=config.get('DataBase', 'password'), db='testdb', loop=loop) cur = await conn.cursor() await cur.execute("SELECT Host,User FROM user") r = await cur.fetchall() await cur.close() conn.close()
class Conenction(): def __init__(self): self.conn = None async def getConnection(self): if self.conn is None: await self.__connect() if not self.conn.is_connected(): await self.__connect() return self.conn async def __connect(self): self.conn = await aiomysql.connect(host=config.get('DataBase', 'host'), port=3306, user=config.get('DataBase','user'), password=config.get('DataBase', 'password'), db='testdb', loop=loop)
class Repository(): def __init__(self): self.cn = Conenction() async def insert(self, item): try: self.cnn = await self.cn.getConnection() self.cur = await self.cnn.cursor() sql = InsertNewSMS val = (item.text, item.phoneNumber) await self.cur.execute(sql, val) await self.cnn.commit() except Exception as e: logging.critical("insertSms "+ str(e)) finally: if self.cur: await self.cur.close() if self.cnn: await self.cnn.close()
ioloop = asyncio.get_event_loop()
application = tornado.web.Application([ (r'/send', Send) ]) if __name__ == "__main__": application.listen(config.get("WebApi", "port")) # как то надо задействовать ioloop, но как? tornado.ioloop.IOLoop.instance().start()#явно не так
Отредактировано Pit (Янв. 10, 2019 10:12:19)
Офлайн
По идее написать
ioloop.IOLoop.instance().start()
и ioloop тот же самый как для Conenction, так и для торнадо
Офлайн
Нашел примерчик:
class PoolHandler(web.RequestHandler): async def get(self): pool = self.application.pool async with pool.acquire() as conn: async with conn.cursor() as cur: await cur.execute("SELECT * FROM users_account LIMIT 1") ret = await cur.fetchone() print(ret) self.finish("ok") class App(web.Application): def __init__(self, pool): settings = { 'debug': True } self._pool = pool super(App, self).__init__( handlers=[ (r'/pool', PoolHandler), ], **settings) @property def pool(self): return self._pool async def init_db_pool(loop): return await aiomysql.create_pool(host='127.0.0.1', port=3306, user='root', password='root', db='hydra', loop=loop) def init_app(pool): app = App(pool) return app if __name__ == '__main__': asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) tornado_asyncio.AsyncIOMainLoop().install() loop = asyncio.get_event_loop() pool = loop.run_until_complete(init_db_pool(loop=loop)) app = init_app(pool=pool) server = httpserver.HTTPServer(app, xheaders=True) server.listen(5070) loop.run_forever()
Офлайн