LTMullineux / fastapi-snippets

A selection of snippets to make working with FastAPI a dream
28 stars 2 forks source link

Can't get imports to work. #1

Open timwilson opened 10 months ago

timwilson commented 10 months ago

Lawson,

Apologies for reaching out via an "issue" that isn't an issue for you, but for me. 😀

First, thanks for your article about setting up a great skeleton for FastAPI and SQLModel projects. I'm trying to use your template, but I'm using SQLite instead of PostgreSQL. I wonder if you have an idea why I'm having trouble getting my modules to import. I've laid things out exactly like you have, but it's not working. (By the way, I cloned your git repo and started it up on my Mac, and it worked just fine.)

Here's what the imports for my app/api/routes/v1/user.py look like in my PyCharm editor. You can see the errors there.

Screenshot 2023-09-30 at 2 47 59 PM

And here's the traceback:

maast-api-app-dev-1  | INFO:     Will watch for changes in these directories: ['/app']
maast-api-app-dev-1  | INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
maast-api-app-dev-1  | INFO:     Started reloader process [1] using StatReload
maast-api-app-dev-1  | Process SpawnProcess-1:
maast-api-app-dev-1  | Traceback (most recent call last):
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/multiprocessing/process.py", line 314, in _bootstrap
maast-api-app-dev-1  |     self.run()
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/multiprocessing/process.py", line 108, in run
maast-api-app-dev-1  |     self._target(*self._args, **self._kwargs)
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started
maast-api-app-dev-1  |     target(sockets=sockets)
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/server.py", line 61, in run
maast-api-app-dev-1  |     return asyncio.run(self.serve(sockets=sockets))
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
maast-api-app-dev-1  |     return runner.run(main)
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
maast-api-app-dev-1  |     return self._loop.run_until_complete(task)
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
maast-api-app-dev-1  |     return future.result()
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/server.py", line 68, in serve
maast-api-app-dev-1  |     config.load()
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/config.py", line 467, in load
maast-api-app-dev-1  |     self.loaded_app = import_from_string(self.app)
maast-api-app-dev-1  |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/importer.py", line 24, in import_from_string
maast-api-app-dev-1  |     raise exc from None
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/importer.py", line 21, in import_from_string
maast-api-app-dev-1  |     module = importlib.import_module(module_str)
maast-api-app-dev-1  |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module
maast-api-app-dev-1  |     return _bootstrap._gcd_import(name[level:], package, level)
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap_external>", line 940, in exec_module
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
maast-api-app-dev-1  |   File "/app/api/server.py", line 1, in <module>
maast-api-app-dev-1  |     from api.routes import router as api_router
maast-api-app-dev-1  |   File "/app/api/routes/__init__.py", line 1, in <module>
maast-api-app-dev-1  |     from api.routes.v1 import router as v1_router
maast-api-app-dev-1  |   File "/app/api/routes/v1/__init__.py", line 8, in <module>
maast-api-app-dev-1  |     api_module = import_module(f"api.routes.v1.{module_name}")
maast-api-app-dev-1  |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module
maast-api-app-dev-1  |     return _bootstrap._gcd_import(name[level:], package, level)
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/app/api/routes/v1/user.py", line 5, in <module>
maast-api-app-dev-1  |     from app.db.session import get_session
maast-api-app-dev-1  | ModuleNotFoundError: No module named 'app'
maast-api-app-dev-1  | WARNING:  StatReload detected changes in 'api/routes/v1/user.py'. Reloading...
maast-api-app-dev-1  | Process SpawnProcess-2:
maast-api-app-dev-1  | Traceback (most recent call last):
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/multiprocessing/process.py", line 314, in _bootstrap
maast-api-app-dev-1  |     self.run()
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/multiprocessing/process.py", line 108, in run
maast-api-app-dev-1  |     self._target(*self._args, **self._kwargs)
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started
maast-api-app-dev-1  |     target(sockets=sockets)
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/server.py", line 61, in run
maast-api-app-dev-1  |     return asyncio.run(self.serve(sockets=sockets))
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
maast-api-app-dev-1  |     return runner.run(main)
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
maast-api-app-dev-1  |     return self._loop.run_until_complete(task)
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
maast-api-app-dev-1  |     return future.result()
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/server.py", line 68, in serve
maast-api-app-dev-1  |     config.load()
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/config.py", line 467, in load
maast-api-app-dev-1  |     self.loaded_app = import_from_string(self.app)
maast-api-app-dev-1  |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/importer.py", line 24, in import_from_string
maast-api-app-dev-1  |     raise exc from None
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/importer.py", line 21, in import_from_string
maast-api-app-dev-1  |     module = importlib.import_module(module_str)
maast-api-app-dev-1  |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module
maast-api-app-dev-1  |     return _bootstrap._gcd_import(name[level:], package, level)
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap_external>", line 940, in exec_module
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
maast-api-app-dev-1  |   File "/app/api/server.py", line 1, in <module>
maast-api-app-dev-1  |     from api.routes import router as api_router
maast-api-app-dev-1  |   File "/app/api/routes/__init__.py", line 1, in <module>
maast-api-app-dev-1  |     from api.routes.v1 import router as v1_router
maast-api-app-dev-1  |   File "/app/api/routes/v1/__init__.py", line 8, in <module>
maast-api-app-dev-1  |     api_module = import_module(f"api.routes.v1.{module_name}")
maast-api-app-dev-1  |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module
maast-api-app-dev-1  |     return _bootstrap._gcd_import(name[level:], package, level)
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/app/api/routes/v1/user.py", line 5, in <module>
maast-api-app-dev-1  |     from db.session import get_session
maast-api-app-dev-1  |   File "/app/db/session.py", line 3, in <module>
maast-api-app-dev-1  |     from app.core.config import settings
maast-api-app-dev-1  | ModuleNotFoundError: No module named 'app'
maast-api-app-dev-1  | WARNING:  StatReload detected changes in 'api/routes/v1/user.py'. Reloading...
maast-api-app-dev-1  | Process SpawnProcess-3:
maast-api-app-dev-1  | Traceback (most recent call last):
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/multiprocessing/process.py", line 314, in _bootstrap
maast-api-app-dev-1  |     self.run()
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/multiprocessing/process.py", line 108, in run
maast-api-app-dev-1  |     self._target(*self._args, **self._kwargs)
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started
maast-api-app-dev-1  |     target(sockets=sockets)
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/server.py", line 61, in run
maast-api-app-dev-1  |     return asyncio.run(self.serve(sockets=sockets))
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
maast-api-app-dev-1  |     return runner.run(main)
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
maast-api-app-dev-1  |     return self._loop.run_until_complete(task)
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
maast-api-app-dev-1  |     return future.result()
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/server.py", line 68, in serve
maast-api-app-dev-1  |     config.load()
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/config.py", line 467, in load
maast-api-app-dev-1  |     self.loaded_app = import_from_string(self.app)
maast-api-app-dev-1  |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/root/.local/lib/python3.11/site-packages/uvicorn/importer.py", line 21, in import_from_string
maast-api-app-dev-1  |     module = importlib.import_module(module_str)
maast-api-app-dev-1  |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module
maast-api-app-dev-1  |     return _bootstrap._gcd_import(name[level:], package, level)
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap_external>", line 940, in exec_module
maast-api-app-dev-1  |   File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
maast-api-app-dev-1  |   File "/app/api/server.py", line 1, in <module>
maast-api-app-dev-1  |     from api.routes import router as api_router
maast-api-app-dev-1  |   File "/app/api/routes/__init__.py", line 1, in <module>
maast-api-app-dev-1  |     from api.routes.v1 import router as v1_router
maast-api-app-dev-1  |   File "/app/api/routes/v1/__init__.py", line 8, in <module>
maast-api-app-dev-1  |     api_module = import_module(f"api.routes.v1.{module_name}")
maast-api-app-dev-1  |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module
maast-api-app-dev-1  |     return _bootstrap._gcd_import(name[level:], package, level)
maast-api-app-dev-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
maast-api-app-dev-1  |   File "/app/api/routes/v1/user.py", line 26
maast-api-app-dev-1  |     location.slug = slugify(location.name)
maast-api-app-dev-1  |     ^^^^^^^^
maast-api-app-dev-1  | IndentationError: expected an indented block after 'if' statement on line 25

The import errors go away if I do the imports this way:

from app.db.session import get_session
from app.models.user import *

If I do that, I just get a different traceback with a ModuleNotFoundError referencing a different file.

I fully realize that this isn't your issue, but do you have any advice?

LTMullineux commented 10 months ago

Hi @timwilson thanks for reaching out and showing an interest in the project.

To help with the issue I have changed the module naming from app to snippets and included full module paths, for example api_module = import_module(f"snippets.api.routes.v1.{module_name}"). This should also help with the PEP import structure of base, 3rd party, local imports if you have a formatter in your IDE.

I'm not sure if there was some clashing between things in your above error without seeing your code or delving to deep into it, but it should work now 🤞🏼 let me know if not.

mark-kazakov commented 4 months ago

Hi @LTMullineux, first of all thank you for sharing this code, I was trying to achieve exactly the same thing, and looing for a boiler plate code to start.

However I run into a similar issue as @timwilson.

Based on your commit: b8662e4628013254a1dc87a0ed209ec09094e3fd, I can see that you have changed the name of the package from app to snippet.

I did change the port for posgresql from 5432 to 6543 since I have an already running database. (But that is not what is causing the issue).

I did run the 'dev' profile with the following command:

docker-compose --profile dev up -d
docker-compose --profile dev logs -f
Attaching to 00-ultimate-fastapi-project-setup_app-dev_1, 00-ultimate-fastapi-project-setup_postgres-dev_1
app-dev_1        | INFO:     Will watch for changes in these directories: ['/snippets']
app-dev_1        | INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
app-dev_1        | INFO:     Started reloader process [1] using WatchFiles
app-dev_1        | Process SpawnProcess-1:
app-dev_1        | Traceback (most recent call last):
app-dev_1        |   File "/usr/local/lib/python3.10/multiprocessing/process.py", line 314, in _bootstrap
app-dev_1        |     self.run()
app-dev_1        |   File "/usr/local/lib/python3.10/multiprocessing/process.py", line 108, in run
app-dev_1        |     self._target(*self._args, **self._kwargs)
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/_subprocess.py", line 78, in subprocess_started
app-dev_1        |     target(sockets=sockets)
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/server.py", line 62, in run
app-dev_1        |     return asyncio.run(self.serve(sockets=sockets))
app-dev_1        |   File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
app-dev_1        |     return loop.run_until_complete(main)
app-dev_1        |   File "uvloop/loop.pyx", line 1517, in uvloop.loop.Loop.run_until_complete
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/server.py", line 69, in serve
app-dev_1        |     config.load()
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/config.py", line 433, in load
app-dev_1        |     self.loaded_app = import_from_string(self.app)
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/importer.py", line 22, in import_from_string
app-dev_1        |     raise exc from None
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/importer.py", line 19, in import_from_string
app-dev_1        |     module = importlib.import_module(module_str)
app-dev_1        |   File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
app-dev_1        |     return _bootstrap._gcd_import(name[level:], package, level)
app-dev_1        |   File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
app-dev_1        |   File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
app-dev_1        |   File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
app-dev_1        |   File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
app-dev_1        |   File "<frozen importlib._bootstrap_external>", line 883, in exec_module
app-dev_1        |   File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
app-dev_1        |   File "/snippets/api/server.py", line 3, in <module>
app-dev_1        |     from snippets.api.routes import router as api_router
app-dev_1        | ModuleNotFoundError: No module named 'snippets'
app-dev_1        | WARNING:  WatchFiles detected changes in 'api/server.py'. Reloading...
app-dev_1        | WARNING:  WatchFiles detected changes in 'api/server.py'. Reloading...
app-dev_1        | Process SpawnProcess-3:
app-dev_1        | Traceback (most recent call last):
app-dev_1        |   File "/usr/local/lib/python3.10/multiprocessing/process.py", line 314, in _bootstrap
app-dev_1        |     self.run()
app-dev_1        |   File "/usr/local/lib/python3.10/multiprocessing/process.py", line 108, in run
app-dev_1        |     self._target(*self._args, **self._kwargs)
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/_subprocess.py", line 78, in subprocess_started
app-dev_1        |     target(sockets=sockets)
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/server.py", line 62, in run
app-dev_1        |     return asyncio.run(self.serve(sockets=sockets))
app-dev_1        |   File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
app-dev_1        |     return loop.run_until_complete(main)
app-dev_1        |   File "uvloop/loop.pyx", line 1517, in uvloop.loop.Loop.run_until_complete
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/server.py", line 69, in serve
app-dev_1        |     config.load()
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/config.py", line 433, in load
app-dev_1        |     self.loaded_app = import_from_string(self.app)
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/importer.py", line 22, in import_from_string
app-dev_1        |     raise exc from None
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/importer.py", line 19, in import_from_string
app-dev_1        |     module = importlib.import_module(module_str)
app-dev_1        |   File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
app-dev_1        |     return _bootstrap._gcd_import(name[level:], package, level)
app-dev_1        |   File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
app-dev_1        |   File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
app-dev_1        |   File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
app-dev_1        |   File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
app-dev_1        |   File "<frozen importlib._bootstrap_external>", line 883, in exec_module
app-dev_1        |   File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
app-dev_1        |   File "/snippets/api/server.py", line 3, in <module>
app-dev_1        |     from snippets.api.routes import router as api_router
app-dev_1        | ModuleNotFoundError: No module named 'snippets'
app-dev_1        | WARNING:  WatchFiles detected changes in 'api/server.py'. Reloading...
app-dev_1        | Process SpawnProcess-4:
app-dev_1        | Traceback (most recent call last):
app-dev_1        |   File "/usr/local/lib/python3.10/multiprocessing/process.py", line 314, in _bootstrap
app-dev_1        |     self.run()
app-dev_1        |   File "/usr/local/lib/python3.10/multiprocessing/process.py", line 108, in run
app-dev_1        |     self._target(*self._args, **self._kwargs)
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/_subprocess.py", line 78, in subprocess_started
app-dev_1        |     target(sockets=sockets)
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/server.py", line 62, in run
app-dev_1        |     return asyncio.run(self.serve(sockets=sockets))
app-dev_1        |   File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
app-dev_1        |     return loop.run_until_complete(main)
app-dev_1        |   File "uvloop/loop.pyx", line 1517, in uvloop.loop.Loop.run_until_complete
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/server.py", line 69, in serve
app-dev_1        |     config.load()
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/config.py", line 433, in load
app-dev_1        |     self.loaded_app = import_from_string(self.app)
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/importer.py", line 22, in import_from_string
app-dev_1        |     raise exc from None
app-dev_1        |   File "/root/.local/lib/python3.10/site-packages/uvicorn/importer.py", line 19, in import_from_string
app-dev_1        |     module = importlib.import_module(module_str)
app-dev_1        |   File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
app-dev_1        |     return _bootstrap._gcd_import(name[level:], package, level)
app-dev_1        |   File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
app-dev_1        |   File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
app-dev_1        |   File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
app-dev_1        |   File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
app-dev_1        |   File "<frozen importlib._bootstrap_external>", line 883, in exec_module
app-dev_1        |   File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
app-dev_1        |   File "/snippets/api/server.py", line 3, in <module>
app-dev_1        |     from snippets.api.routes import router as api_router
app-dev_1        | ModuleNotFoundError: No module named 'snippets'
postgres-dev_1   | 
postgres-dev_1   | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-dev_1   | 
postgres-dev_1   | 2024-03-14 14:36:24.261 UTC [1] LOG:  starting PostgreSQL 15.4 on x86_64-pc-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r10) 12.2.1 20220924, 64-bit
postgres-dev_1   | 2024-03-14 14:36:24.261 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres-dev_1   | 2024-03-14 14:36:24.261 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres-dev_1   | 2024-03-14 14:36:24.273 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-dev_1   | 2024-03-14 14:36:24.287 UTC [24] LOG:  database system was shut down at 2024-03-14 14:36:20 UTC
postgres-dev_1   | 2024-03-14 14:36:24.296 UTC [1] LOG:  database system is ready to accept connections
postgres-dev_1   | 2024-03-14 14:41:24.368 UTC [22] LOG:  checkpoint starting: time
postgres-dev_1   | 2024-03-14 14:41:24.419 UTC [22] LOG:  checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.001 s, sync=0.013 s, total=0.052 s; sync files=2, longest=0.007 s, average=0.007 s;

Getting the following log from the 'test' profile:

WARNING: Image for service app-test was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating 00-ultimate-fastapi-project-setup_postgres-test_1 ... done
Creating 00-ultimate-fastapi-project-setup_app-test_1      ... done
bash-5.2$ docker-compose --profile test logs -f
Attaching to 00-ultimate-fastapi-project-setup_app-test_1, 00-ultimate-fastapi-project-setup_postgres-test_1
postgres-test_1  | The files belonging to this database system will be owned by user "postgres".
postgres-test_1  | This user must also own the server process.
postgres-test_1  | 
postgres-test_1  | The database cluster will be initialized with locale "en_US.utf8".
postgres-test_1  | The default database encoding has accordingly been set to "UTF8".
postgres-test_1  | The default text search configuration will be set to "english".
postgres-test_1  | 
postgres-test_1  | Data page checksums are disabled.
postgres-test_1  | 
postgres-test_1  | fixing permissions on existing directory /var/lib/postgresql/data ... ok
postgres-test_1  | creating subdirectories ... ok
postgres-test_1  | selecting dynamic shared memory implementation ... posix
postgres-test_1  | selecting default max_connections ... 100
postgres-test_1  | selecting default shared_buffers ... 128MB
postgres-test_1  | selecting default time zone ... UTC
postgres-test_1  | creating configuration files ... ok
postgres-test_1  | running bootstrap script ... ok
postgres-test_1  | sh: locale: not found
postgres-test_1  | 2024-03-14 14:52:43.109 UTC [30] WARNING:  no usable system locales were found
postgres-test_1  | performing post-bootstrap initialization ... ok
postgres-test_1  | syncing data to disk ... ok
postgres-test_1  | 
postgres-test_1  | 
postgres-test_1  | Success. You can now start the database server using:
postgres-test_1  | 
postgres-test_1  |     pg_ctl -D /var/lib/postgresql/data -l logfile start
postgres-test_1  | 
postgres-test_1  | initdb: warning: enabling "trust" authentication for local connections
postgres-test_1  | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
postgres-test_1  | waiting for server to start....2024-03-14 14:52:49.503 UTC [36] LOG:  starting PostgreSQL 15.4 on x86_64-pc-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r10) 12.2.1 20220924, 64-bit
postgres-test_1  | 2024-03-14 14:52:49.509 UTC [36] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-test_1  | 2024-03-14 14:52:49.527 UTC [39] LOG:  database system was shut down at 2024-03-14 14:52:43 UTC
postgres-test_1  | 2024-03-14 14:52:49.535 UTC [36] LOG:  database system is ready to accept connections
postgres-test_1  |  done
postgres-test_1  | server started
postgres-test_1  | 
postgres-test_1  | /usr/local/bin/docker-entrypoint.sh: sourcing /docker-entrypoint-initdb.d/10_postgis.sh
postgres-test_1  | CREATE DATABASE
postgres-test_1  | Loading PostGIS extensions into template_postgis
postgres-test_1  | CREATE EXTENSION
postgres-test_1  | CREATE EXTENSION
postgres-test_1  | You are now connected to database "template_postgis" as user "postgres".
postgres-test_1  | CREATE EXTENSION
postgres-test_1  | CREATE EXTENSION
postgres-test_1  | Loading PostGIS extensions into postgres
postgres-test_1  | CREATE EXTENSION
postgres-test_1  | CREATE EXTENSION
postgres-test_1  | You are now connected to database "postgres" as user "postgres".
postgres-test_1  | CREATE EXTENSION
postgres-test_1  | CREATE EXTENSION
postgres-test_1  | 
postgres-test_1  | waiting for server to shut down....2024-03-14 14:52:52.624 UTC [36] LOG:  received fast shutdown request
postgres-test_1  | 2024-03-14 14:52:52.630 UTC [36] LOG:  aborting any active transactions
postgres-test_1  | 2024-03-14 14:52:52.631 UTC [36] LOG:  background worker "logical replication launcher" (PID 42) exited with exit code 1
postgres-test_1  | 2024-03-14 14:52:52.631 UTC [37] LOG:  shutting down
postgres-test_1  | 2024-03-14 14:52:52.637 UTC [37] LOG:  checkpoint starting: shutdown immediate
postgres-test_1  | 2024-03-14 14:52:52.749 UTC [61] FATAL:  the database system is shutting down
postgres-test_1  | ...2024-03-14 14:52:56.447 UTC [37] LOG:  checkpoint complete: wrote 3805 buffers (23.2%); 0 WAL file(s) added, 0 removed, 2 recycled; write=0.091 s, sync=3.661 s, total=3.816 s; sync files=785, longest=0.012 s, average=0.005 s; distance=31471 kB, estimate=31471 kB
postgres-test_1  | 2024-03-14 14:52:56.453 UTC [36] LOG:  database system is shut down
postgres-test_1  |  done
postgres-test_1  | server stopped
postgres-test_1  | 
postgres-test_1  | PostgreSQL init process complete; ready for start up.
postgres-test_1  | 
postgres-test_1  | 2024-03-14 14:52:56.558 UTC [1] LOG:  starting PostgreSQL 15.4 on x86_64-pc-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r10) 12.2.1 20220924, 64-bit
postgres-test_1  | 2024-03-14 14:52:56.558 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres-test_1  | 2024-03-14 14:52:56.558 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres-test_1  | 2024-03-14 14:52:56.570 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-test_1  | 2024-03-14 14:52:56.583 UTC [65] LOG:  database system was shut down at 2024-03-14 14:52:56 UTC
postgres-test_1  | 2024-03-14 14:52:56.591 UTC [1] LOG:  database system is ready to accept connections
app-test_1       | ImportError while loading conftest '/snippets/tests/conftest.py'.
app-test_1       | tests/conftest.py:9: in <module>
app-test_1       |     from snippets.core.config import settings
app-test_1       | core/config.py:3: in <module>
app-test_1       |     from pydantic import BaseSettings, Field, PostgresDsn, validator
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/__init__.py:374: in __getattr__
app-test_1       |     return _getattr_migration(attr_name)
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/_migration.py:296: in wrapper
app-test_1       |     raise PydanticImportError(
app-test_1       | E   pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` package. See https://docs.pydantic.dev/2.6/migration/#basesettings-has-moved-to-pydantic-settings for more details.
app-test_1       | E
app-test_1       | E   For further information visit https://errors.pydantic.dev/2.6/u/import-error
app-test_1       | ImportError while loading conftest '/snippets/tests/conftest.py'.
app-test_1       | tests/conftest.py:9: in <module>
app-test_1       |     from snippets.core.config import settings
app-test_1       | core/config.py:3: in <module>
app-test_1       |     from pydantic import BaseSettings, Field, PostgresDsn, validator
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/__init__.py:374: in __getattr__
app-test_1       |     return _getattr_migration(attr_name)
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/_migration.py:296: in wrapper
app-test_1       |     raise PydanticImportError(
app-test_1       | E   pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` package. See https://docs.pydantic.dev/2.6/migration/#basesettings-has-moved-to-pydantic-settings for more details.
app-test_1       | E
app-test_1       | E   For further information visit https://errors.pydantic.dev/2.6/u/import-error
app-test_1       | ImportError while loading conftest '/snippets/tests/conftest.py'.
app-test_1       | tests/conftest.py:9: in <module>
app-test_1       |     from snippets.core.config import settings
app-test_1       | core/config.py:3: in <module>
app-test_1       |     from pydantic import BaseSettings, Field, PostgresDsn, validator
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/__init__.py:374: in __getattr__
app-test_1       |     return _getattr_migration(attr_name)
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/_migration.py:296: in wrapper
app-test_1       |     raise PydanticImportError(
app-test_1       | E   pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` package. See https://docs.pydantic.dev/2.6/migration/#basesettings-has-moved-to-pydantic-settings for more details.
app-test_1       | E
app-test_1       | E   For further information visit https://errors.pydantic.dev/2.6/u/import-error
app-test_1       | ImportError while loading conftest '/snippets/tests/conftest.py'.
app-test_1       | tests/conftest.py:9: in <module>
app-test_1       |     from snippets.core.config import settings
app-test_1       | core/config.py:3: in <module>
app-test_1       |     from pydantic import BaseSettings, Field, PostgresDsn, validator
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/__init__.py:374: in __getattr__
app-test_1       |     return _getattr_migration(attr_name)
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/_migration.py:296: in wrapper
app-test_1       |     raise PydanticImportError(
app-test_1       | E   pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` package. See https://docs.pydantic.dev/2.6/migration/#basesettings-has-moved-to-pydantic-settings for more details.
app-test_1       | E
app-test_1       | E   For further information visit https://errors.pydantic.dev/2.6/u/import-error
app-test_1       | ImportError while loading conftest '/snippets/tests/conftest.py'.
app-test_1       | tests/conftest.py:9: in <module>
app-test_1       |     from snippets.core.config import settings
app-test_1       | core/config.py:3: in <module>
app-test_1       |     from pydantic import BaseSettings, Field, PostgresDsn, validator
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/__init__.py:374: in __getattr__
app-test_1       |     return _getattr_migration(attr_name)
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/_migration.py:296: in wrapper
app-test_1       |     raise PydanticImportError(
app-test_1       | E   pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` package. See https://docs.pydantic.dev/2.6/migration/#basesettings-has-moved-to-pydantic-settings for more details.
app-test_1       | E
app-test_1       | E   For further information visit https://errors.pydantic.dev/2.6/u/import-error
app-test_1       | ImportError while loading conftest '/snippets/tests/conftest.py'.
app-test_1       | tests/conftest.py:9: in <module>
app-test_1       |     from snippets.core.config import settings
app-test_1       | core/config.py:3: in <module>
app-test_1       |     from pydantic import BaseSettings, Field, PostgresDsn, validator
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/__init__.py:374: in __getattr__
app-test_1       |     return _getattr_migration(attr_name)
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/_migration.py:296: in wrapper
app-test_1       |     raise PydanticImportError(
app-test_1       | E   pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` package. See https://docs.pydantic.dev/2.6/migration/#basesettings-has-moved-to-pydantic-settings for more details.
app-test_1       | E
app-test_1       | E   For further information visit https://errors.pydantic.dev/2.6/u/import-error
app-test_1       | ImportError while loading conftest '/snippets/tests/conftest.py'.
app-test_1       | tests/conftest.py:9: in <module>
app-test_1       |     from snippets.core.config import settings
app-test_1       | core/config.py:3: in <module>
app-test_1       |     from pydantic import BaseSettings, Field, PostgresDsn, validator
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/__init__.py:374: in __getattr__
app-test_1       |     return _getattr_migration(attr_name)
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/_migration.py:296: in wrapper
app-test_1       |     raise PydanticImportError(
app-test_1       | E   pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` package. See https://docs.pydantic.dev/2.6/migration/#basesettings-has-moved-to-pydantic-settings for more details.
app-test_1       | E
app-test_1       | E   For further information visit https://errors.pydantic.dev/2.6/u/import-error
app-test_1       | ImportError while loading conftest '/snippets/tests/conftest.py'.
app-test_1       | tests/conftest.py:9: in <module>
app-test_1       |     from snippets.core.config import settings
app-test_1       | core/config.py:3: in <module>
app-test_1       |     from pydantic import BaseSettings, Field, PostgresDsn, validator
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/__init__.py:374: in __getattr__
app-test_1       |     return _getattr_migration(attr_name)
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/_migration.py:296: in wrapper
app-test_1       |     raise PydanticImportError(
app-test_1       | E   pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` package. See https://docs.pydantic.dev/2.6/migration/#basesettings-has-moved-to-pydantic-settings for more details.
app-test_1       | E
app-test_1       | E   For further information visit https://errors.pydantic.dev/2.6/u/import-error
app-test_1       | ImportError while loading conftest '/snippets/tests/conftest.py'.
app-test_1       | tests/conftest.py:9: in <module>
app-test_1       |     from snippets.core.config import settings
app-test_1       | core/config.py:3: in <module>
app-test_1       |     from pydantic import BaseSettings, Field, PostgresDsn, validator
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/__init__.py:374: in __getattr__
app-test_1       |     return _getattr_migration(attr_name)
app-test_1       | /root/.local/lib/python3.10/site-packages/pydantic/_migration.py:296: in wrapper
app-test_1       |     raise PydanticImportError(
app-test_1       | E   pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` package. See https://docs.pydantic.dev/2.6/migration/#basesettings-has-moved-to-pydantic-settings for more details.
app-test_1       | E
app-test_1       | E   For further information visit https://errors.pydantic.dev/2.6/u/import-error
 the 'dev' profile with the following command:
00-ultimate-fastapi-project-setup_app-test_1 exited with code 4
qbicsky commented 3 weeks ago

@mark-kazakov, You're using Pydantic version incompatible with this boilerplate. You need to import additional pydantic-settings and import BaseSettings form there. Read your logs in the future please. :)

"pydantic.errors.PydanticImportError: BaseSettings has been moved to the pydantic-settings package. See https://docs.pydantic.dev/2.6/migration/#basesettings-has-moved-to-pydantic-settings for more details."