Flask app crashes (most likely due to a circular import)

Viewed 4988

I followed this tutorial here: https://youtu.be/mISFEwojJmE?t=367. It's a very simple Flask app for creating user login and registration pages for a site. Everything works up to this point in the tutorial: when importing objects amongst the scripts in my project I get this error.

Error:

flask.cli.NoAppException
flask.cli.NoAppException: While importing "app", an ImportError was raised:

Traceback (most recent call last):
  File "c:\users\dejar\onedrive\coding\themes & applications\002 static template\install\env\lib\site-packages\flask\cli.py", line 240, in locate_app
    __import__(module_name)
  File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\app.py", line 6, in <module>
    from account import routes
  File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\account\routes.py", line 5, in <module>
    from app import app, now
ImportError: cannot import name 'app' from partially initialized module 'app' (most likely due to a circular import) (C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\app.py)

Traceback (most recent call last)
File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\app.py", line 6, in <module>
from account import routes
File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\account\routes.py", line 5, in <module>
from app import app, now
During handling of the above exception, another exception occurred:
File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\env\Lib\site-packages\flask\cli.py", line 338, in __call__
self._flush_bg_loading_exception()
File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\env\Lib\site-packages\flask\cli.py", line 326, in _flush_bg_loading_exception
reraise(*exc_info)
File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\env\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\env\Lib\site-packages\flask\cli.py", line 314, in _load_app
self._load_unlocked()
File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\env\Lib\site-packages\flask\cli.py", line 330, in _load_unlocked
self._app = rv = self.loader()
File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\env\Lib\site-packages\flask\cli.py", line 388, in load_app
app = locate_app(self, import_name, name)
File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\env\Lib\site-packages\flask\cli.py", line 245, in locate_app
raise NoAppException(
flask.cli.NoAppException: While importing "app", an ImportError was raised:

Traceback (most recent call last):
File "c:\users\dejar\onedrive\coding\themes & applications\002 static template\install\env\lib\site-packages\flask\cli.py", line 240, in locate_app
__import__(module_name)
File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\app.py", line 6, in <module>
from account import routes
File "C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\account\routes.py", line 5, in <module>
from app import app, now
ImportError: cannot import name 'app' from partially initialized module 'app' (most likely due to a circular import) (C:\Users\dejar\OneDrive\Coding\Themes & Applications\002 Static Template\Install\app.py)
The debugger caught an exception in your WSGI application. You can now look at the traceback which led to the error.
To switch between the interactive traceback and the plaintext one, you can click on the "Traceback" headline. From the text traceback you can also create a paste of it. For code execution mouse-over the frame you want to debug and click on the console icon on the right side.

You can execute arbitrary Python code in the stack frames and there are some extra helpers available for introspection:

dump() shows all variables in the frame
dump(obj) dumps all that's known about the object

Instead of posting my actual app, I went back and just duplicated his app up to this point in the tutorial, which works on his Mac. But throws the same error as my actual app, running on my PC. I also attempted with my env from both VS Code and Command-Line as administrator. Here it is:

File Structure

C:.Root directory for the project
|   app.py
|   tree.txt
|   
+---env
......more evn files and folders
|           
+---static
|   +---css
|   |       normalize.css
|   |       styles.css
|   |       
|   \---js
|           jquery.js
|           
+---templates
|       base.html
|       dashboard.html
|       home.html
|       
+---user
|   |   models.py
|   |   routes.py
|   |   __init__.py
|   |   
|   \---__pycache__
|           routes.cpython-38.pyc
|           __init__.cpython-38.pyc
|           
\---__pycache__
        app.cpython-38.pyc

app.py

from flask import Flask, render_template

# account routes
from user import routes

# create and configure the app, an instance of Flask
app = Flask(__name__)


@app.route("/")
def home():
    return render_template("home.html")


@app.route("/dashboard/")
def dashboard():
    return render_template("dashboard.html")

models.py

from flask import Flask, jsonify


class User:
    def signup(self):
        user = {"_id": "", "name": "", "email": "", "password": ""}
        return jsonify(user), 200
        # if successful, return status code 200 in json format

routes.py

from flask import Flask, render_template

# import the instance of app from app.py
# from file/module import instance
from app import app

# from folder.file import class
from user.models import User


@app.route("/user/signup", methods=["GET"])
def signup():
    return User().signup()

Note: The init.py file is empty

1 Answers

What the error message cannot import name 'app' from partially initialized module 'app' is saying is that as Python compiles one file, it needs to compile another – the module to import. However, that second file also requires an import to be read, which is the original first file. So python cannot compile one without compiling the other.

The best solution to this is to simply import app.routes at the end of your app.py file, like so:

from flask import Flask, render_template #imports at the top

#the rest of your code

from app import routes

That should solve the problem.

Keep from app import app at the top of your routes.py. Bear in mind that not having an init.py in your app directory may lead to importing difficulties.

EDIT:

As formerlyanakin said, the import statement doesn't have to be at the end of the file. Instead, it can be positioned at any point after app is initialised:

app.py:

# create and configure the app, an instance of Flask
app = Flask(__name__)
    
# account routes
from user import routes
Related