【问题标题】:testdriven.io: Test-Driven Development with FastAPI and Docker: Heroku: Getting asyncpg.exceptions.InvalidAuthorizationSpecificationErrortestdriven.io:使用 FastAPI 和 Docker 进行测试驱动开发:Heroku:获取 asyncpg.exceptions.InvalidAuthorizationSpecificationError
【发布时间】:2021-02-09 13:06:37
【问题描述】:

我正在学习来自 testdriven.io 的课程 Test-Driven Development with FastAPI and Docker,只是坚持将我的应用程序发布到 heroku(第 2 部分:部署)。在我将图像发布到 heroku 之前,一切都很好:

heroku container:release web --app APP_NAME

然后我检查了https://APP_NAME.herokuapp.com/ping/ 端点并得到了

503 服务不可用。

需要帮助。我在heroku logs --tail找到了这样的回溯:

2021-02-09T12:37:53.995055+00:00 app[web.1]: [2021-02-09 12:37:53 +0000] [27] [ERROR] Application startup failed. Exiting.
2021-02-09T12:37:53.995458+00:00 app[web.1]: [2021-02-09 12:37:53 +0000] [27] [INFO] Worker exiting (pid: 27)
2021-02-09T12:37:54.123770+00:00 app[web.1]: [2021-02-09 12:37:54 +0000] [32] [INFO] Booting worker with pid: 32
2021-02-09T12:37:54.773146+00:00 app[web.1]: [2021-02-09 12:37:54 +0000] [32] [INFO] Started server process [32]
2021-02-09T12:37:54.773392+00:00 app[web.1]: [2021-02-09 12:37:54 +0000] [32] [INFO] Waiting for application startup.
2021-02-09T12:37:54.885999+00:00 app[web.1]: [2021-02-09 12:37:54 +0000] [32] [ERROR] Traceback (most recent call last):
2021-02-09T12:37:54.886001+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/starlette/routing.py", line 526, in lifespan
2021-02-09T12:37:54.886002+00:00 app[web.1]: async for item in self.lifespan_context(app):
2021-02-09T12:37:54.886003+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/starlette/routing.py", line 467, in default_lifespan
2021-02-09T12:37:54.886004+00:00 app[web.1]: await self.startup()
2021-02-09T12:37:54.886004+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/starlette/routing.py", line 502, in startup
2021-02-09T12:37:54.886004+00:00 app[web.1]: await handler()
2021-02-09T12:37:54.886005+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/tortoise/contrib/fastapi/__init__.py", line 92, in init_orm
2021-02-09T12:37:54.886006+00:00 app[web.1]: await Tortoise.init(config=config, config_file=config_file, db_url=db_url, modules=modules)
2021-02-09T12:37:54.886006+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/tortoise/__init__.py", line 567, in init
2021-02-09T12:37:54.886007+00:00 app[web.1]: await cls._init_connections(connections_config, _create_db)
2021-02-09T12:37:54.886007+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/tortoise/__init__.py", line 385, in _init_connections
2021-02-09T12:37:54.886008+00:00 app[web.1]: await connection.create_connection(with_db=True)
2021-02-09T12:37:54.886008+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/tortoise/backends/asyncpg/client.py", line 94, in create_connection
2021-02-09T12:37:54.886009+00:00 app[web.1]: self._pool = await asyncpg.create_pool(None, password=self.password, **self._template)
2021-02-09T12:37:54.886009+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/asyncpg/pool.py", line 398, in _async__init__
2021-02-09T12:37:54.886010+00:00 app[web.1]: await self._initialize()
2021-02-09T12:37:54.886010+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/asyncpg/pool.py", line 426, in _initialize
2021-02-09T12:37:54.886010+00:00 app[web.1]: await first_ch.connect()
2021-02-09T12:37:54.886011+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/asyncpg/pool.py", line 125, in connect
2021-02-09T12:37:54.886011+00:00 app[web.1]: self._con = await self._pool._get_new_connection()
2021-02-09T12:37:54.886012+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/asyncpg/pool.py", line 468, in _get_new_connection
2021-02-09T12:37:54.886012+00:00 app[web.1]: con = await connection.connect(
2021-02-09T12:37:54.886012+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/asyncpg/connection.py", line 1718, in connect
2021-02-09T12:37:54.886013+00:00 app[web.1]: return await connect_utils._connect(
2021-02-09T12:37:54.886013+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/asyncpg/connect_utils.py", line 663, in _connect
2021-02-09T12:37:54.886014+00:00 app[web.1]: con = await _connect_addr(
2021-02-09T12:37:54.886014+00:00 app[web.1]: File "/usr/local/lib/python3.8/site-packages/asyncpg/connect_utils.py", line 642, in _connect_addr
2021-02-09T12:37:54.886014+00:00 app[web.1]: await asyncio.wait_for(connected, timeout=timeout)
2021-02-09T12:37:54.886015+00:00 app[web.1]: File "/usr/local/lib/python3.8/asyncio/tasks.py", line 491, in wait_for
2021-02-09T12:37:54.886015+00:00 app[web.1]: return fut.result()
2021-02-09T12:37:54.886016+00:00 app[web.1]: asyncpg.exceptions.InvalidAuthorizationSpecificationError: no pg_hba.conf entry for host "XXX.XXX.XXX.XXX", user "XXXXXXXXXX", database "XXXXXXXXXXXX", SSL off

【问题讨论】:

标签: heroku fastapi testdriven.io


【解决方案1】:

尝试更新以下依赖项:

asyncpg==0.22.0
fastapi==0.63.0
requests==2.25.1
tortoise-orm==0.16.21

https://github.com/testdrivenio/fastapi-tdd-docker/issues/5#issuecomment-798435535

【讨论】:

    【解决方案2】:

    所以我遇到了同样的问题,经过一段时间的折腾,这就是我让它工作的方式。我 100% 知道有更好的方法,但我只是想继续前进。

    # project/app/db.py
    
    import logging
    import os
    import ssl # New
    
    from fastapi import FastAPI
    from tortoise import Tortoise, run_async
    from tortoise.contrib.fastapi import register_tortoise
    
    log = logging.getLogger("uvicorn")
    
    # DB setup
    db_full_url = os.environ.get("DATABASE_URL") # New
    host = db_full_url.split("//")[1].split(":")[1].split("@")[1] # New
    user = db_full_url.split("//")[1].split(":")[0] # New
    password = db_full_url.split("//")[1].split(":")[1].split("@")[0] # New
    db = db_full_url.split("/")[3] # New
    ctx = ssl.create_default_context() # New
    ctx.check_hostname = False # New
    ctx.verify_mode = ssl.CERT_NONE # New
    
    
    def init_db(app: FastAPI) -> None:
        log.info("Initializing DB...")
        register_tortoise(
            app,
            config={
                'connections': {
                    'default': {
                        'engine': 'tortoise.backends.asyncpg',
                        'credentials': {
                          'host': host,
                          'port': '5432',
                          'user': user,
                          'password': password,
                          'database': db,
                          'ssl': ctx,
                        },
                    },
                },
                'apps': {
                    'models': {
                        'models': ["app.models.tortoise"],
                        'default_connection': 'default',
                    }
                }
            }
        )
        log.info(db_full_url)
    

    【讨论】:

    • 非常感谢!!但是,要继续前进,我也必须将此类配置添加到 generate_schema() 中,将 modules={"models": ["app.models.tortoise"]} 替换为 modules={"models": ["models.tortoise"]}。不要问我为什么是 Idk,但它现在可以工作了......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    相关资源
    最近更新 更多