[Python/ERROR] Circular import (Runtimeκ³Ό Import Timeμ μ°¨μ΄μ )
μλ¬λ©μμ§
ImportError: cannot import name 'db' from partially initialized module 'app' (most likely due to a circular import)
ν΄λΉ μλ¬λ λͺ¨λ κ°μ μλ‘λ₯Ό "μνΈ μ°Έμ‘°"ν λ λ°μνλ€.
μλ‘μ΄ λͺ¨λμ import ν΄μ€ λ κΌ¬μ΄λ©΄ ν΄λΉ μλ¬κ° λ°μνλ€.
λμ κ²½μ° Flask νλ μμν¬λ₯Ό μ΄μ©ν΄μ μλμ κ°μ ν΄λ κ΅¬μ‘°λ‘ κ°λ°νλ€κ° μμ μλ¬λ₯Ό λ§λκ² λμλ€. (μλ ν΄λꡬ쑰λ λ¨μνν κ²μ)
app/
βββ __init__.py
βββ models.py
βββ routers.py
βββ config.py
βββ run.py
app.py
1. __init__.pyμ models.pyμ app.py νμΌμ κ°κ° μμΈν μ΄ν΄λ³΄μ.
# __init__.py
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from app.models import app
db = SQLAlchemy()
def create_app(config_class=Config):
app.config['SQLALCHEMY_DATABASE_URI'] = Config.SQLALCHEMY_DATABASE_URI
app.secret_key = Config.SECRET_KEY
db.init_app(app)
from app.views import main
app.register_blueprint(main.bp)
return app
# models.py
from flask import Flask
from app import db
from datetime import datetime
app = Flask(__name__)
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), nullable=False)
email = db.Column(db.String(255), nullable=False)
password = db.Column(db.String(255), nullable=False)
...
# νμΌμ΄ μ§μ μ€νλ λλ§ λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈμ μμ±νλλ‘ νλ€. (μ€μ applicationμμλ μ κ±°)
if __name__ == "__main__":
with app.app_context():
db.create_all()
# app.py
from app import create_app
from app import db
from config import Config
app = create_app(config_class=Config)
if __name__ == '__main__':
app.run(debug=True, port=8000)
2. μ΄ν΄λ³΄λ©΄ models.pyμ appν΄λ μμ __init__.py νμΌμ΄ μλ‘λ₯Ό μ°Έμ‘°νκ³ μλ κ²μ λ³Ό μ μλ€.
__init__.pyμ from app.models import app ↔οΈ models.pyμ from app import db
(κΌ νμν λΆλΆλ§ 보μλ©΄ μλμ κ°λ€)
# __init__.py
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from app.models import app # μ¬κΈ°
db = SQLAlchemy()
def create_app(config_class=Config):
app.config['SQLALCHEMY_DATABASE_URI'] = Config.SQLALCHEMY_DATABASE_URI
app.secret_key = Config.SECRET_KEY
db.init_app(app)
return app
# models.py
from flask import Flask
from app import db # μ¬κΈ°
app = Flask(__name__)
if __name__ == "__main__":
with app.app_context():
db.create_all()
3. μλμ κ°μ΄ μ°Έμ‘°νλ μ½λλ€μ λ°κΏμ£Όμλ€.
# __init__.py
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app(config_class=Config):
app = Flask(__name__) # μ¬κΈ°
app.config['SQLALCHEMY_DATABASE_URI'] = Config.SQLALCHEMY_DATABASE_URI
app.secret_key = Config.SECRET_KEY
db.init_app(app)
from app.views import main
app.register_blueprint(main.bp)
return app
- models.pyμ μλ app = Flask(__name__) μΈμ€ν΄μ€ μμ± κ΅¬λ¬Έμ __init__.pyμ create_app() λ©μλ μμ μ§μ μΈμ€ν΄μ€λ‘ μμ±
# models.py
from flask import Flask
from app import db
from datetime import datetime
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), nullable=False)
email = db.Column(db.String(255), nullable=False)
password = db.Column(db.String(255), nullable=False)
# app.py
from app import create_app
from app import db
from config import Config
app = create_app(config_class=Config)
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True, port=8088)
- models.pyμ μλ ifλ¬Έμ app.py νμΌμ ifλ¬Έ μμ μΆκ°
μμ κ°μ΄ λ°κΏμ€μΌλ‘μ¨ μλ¬λ₯Ό ν΄κ²°νμλ€.
μ΄λ¬ν μλ¬κ° μ λ°μνλμ§ μμ보μ
pythonμμλ μ½λμ μ€ν μμ κ³Ό λͺ¨λμ μν¬νΈνλ μμ μ΄ λΆλ¦¬λμ΄ μκΈ° λλ¬Έμ΄λ€.
κ·Έλμ λͺ¨λ κ°μ μν μ°Έμ‘° λ¬Έμ κ° λ°μνκ² λλ κ²μ΄λ€.
(pythonμ μνΈμ°Έμ‘°λλ λͺ¨λ λ΄λΆμ μ½λλ₯Ό μμ°¨μ μΌλ‘ μ€ννκΈ° λλ¬Έμ, νλμ λͺ¨λμ΄ μν¬νΈν λ ν΄λΉ λͺ¨λ λ΄λΆμμ λ€λ₯Έ λͺ¨λμ μ°Έμ‘°νκ³ , κ·Έ λ€λ₯Έ λͺ¨λμμ λ€μ μ²μ λͺ¨λμ μ°Έμ‘°νλ μμΌλ‘ μν μ°Έμ‘° λ°μνκ² λ κ²)
- Runtime: λͺ¨λμ μν¬νΈν ν ν΄λΉ λͺ¨λ λ΄μ ν΄λμ€λ ν¨μλ₯Ό μ€μ λ‘ μ¬μ©νλ μμ . μ΄λ ν΄λμ€λ ν¨μμ λ³Έλ¬Έμ΄ μ€νλλ©° μ½λκ° μ€μ λ‘ λμνλ€.
- Import Time: Pythonμ λͺ¨λμ μν¬νΈν λ ν΄λΉ λͺ¨λμ μ½λλ₯Ό νμ±νλ€. μ΄λ λͺ¨λ λ΄λΆμ ν΄λμ€, ν¨μ, λ³μ λ±μ΄ μ μλκ³ μ€νλλ€. μ¦ λͺ¨λμ΄ μν¬νΈλλ μμ μμλ ν΄λμ€λ ν¨μμ μ€μ μ€νμ λ°μνμ§ μκ³ , λ¨μν μ½λλ§ λΆμλ ν μ€μ μ€νμ 미루μ΄μ§λ€.
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν λ°©λ²μΌλ‘λ νλ‘μ νΈ κ΅¬μ‘°μ λ°λΌ κ·Έλλ§λ€ λ¬λΌμ§κ² μ§λ§,
κ²°κ΅ μν¬νΈ μμ κ³Ό μ€ν μμ μ μ μ νκ² μ‘°μ¨νλ κ²μΌλ‘ ν΄κ²°ν μ μλ€.
[μ°Έκ³ λ§ν¬]
https://blog.mathpresso.com/python-circular-imports-e89c5bf16510