Почему мое приложение торнадо не работает? (Блог торнадо с aiomysql) - PullRequest
0 голосов
/ 09 апреля 2019
import tornado.ioloop
import tornado.web
import tornado.options
import tornado.locks
import os.path

from tornado.options import define, options
from aiomysql import create_pool

define("port", default=8080, help="run on the given port", type=int)
define("db_host", default="localhost", help="blog database host")
define("db_port", default=3306, help="blog database port")
define("db_database", default="{db_name}", help="blog database name")
define("db_user", default="{db_user}", help="blog database user")
define("db_password", default="{password}", help="blog database password")

async def maybe_create_tables(db):
    async with db.acquire() as conn:
        async with conn.cursor() as cur:
            try:
                await cur.execute("SELECT COUNT(*) FROM user LIMIT 1")
                await cur.fetchone()
            except Exception as e:
                with open("schema.sql") as f:
                    schema = f.read()
                    await cur.execute(schema)

class Application(tornado.web.Application):
    def __init__(self, db):
        self.db = db
        handlers = [
            (r"/", HomeHandler),
            (r".*", BaseHandler)
        ]
        settings = dict(
            debug=True
        )
        super(Application, self).__init__(handlers, **settings)

class BaseHandler(tornado.web.RequestHandler):
   def set_default_headers(self):
        self.set_header("Server", "tornado")

class HomeHandler(BaseHandler):
    async def get(self):
        self.write("hello")

async def main():
    tornado.options.parse_command_line()

    async with create_pool(
        host=options.db_host,
        port=options.db_port,
        user=options.db_user,
        password=options.db_password,
        db=options.db_database,
    ) as db:
        await maybe_create_tables(db)
        app = Application()
        app.listen(options.port)

    shutdown_event = tornado.locks.Event()
    await shutdown_event.wait()

if __name__ == "__main__":
    tornado.ioloop.IOLoop.current().run_sync(main)

Я скопировал эти коды отсюда (https://github.com/xzhdream/tornado-blog-aiomysql/blob/master/blog.py),, но это не работает. Когда я запускаю это приложение, нет ошибки вывода, но консоль зависла. Mysql и Mysql User настройки должны быть выполнены правильно. Я проверял это много раз.

1 Ответ

0 голосов
/ 16 апреля 2019
  1. Ваш Application.__init__ принимает аргумент db, но вы не передаете его при вызове Application. Я не знаю, почему вы не получаете никаких сообщений об ошибках по этой проблеме.

  2. Вызов await shutdown_event.wait() находится за пределами async with create_pool, поэтому пул соединений с базой данных будет закрыт, как только инициализация будет завершена, и будет недоступна во время работы сервера. Сделайте отступ для этих строк, чтобы они были включены в блок async with.

...