[英]Flask ImportError: cannot import name ''
這是我的應用程序樹,因為此應用程序相對較大,所以我使用藍圖分區結構來構造它。
RPOSS
├───.idea
├───app
│ ├───customer_panel
│ │ ├───static
│ │ ├───templates
│ │ └───__pycache__
│ ├───owner_panel
│ │ ├───static
│ │ │ └───js
│ │ │ └───lib
│ │ ├───templates
│ │ └───__pycache__
│ ├───progressive_panel
│ │ ├───static
│ │ ├───templates
│ │ └───__pycache__
│ ├───static
│ ├───templates
│ └───__pycache__
├───Include
├───instance
│ └───__pycache__
├───Lib
├───Scripts
└───__pycache__
RPOSS/app/run.py
:
from app import app
app.run()
RPOSS/app/__init__.py
:
from app.views import Rmod
from app.customer_panel.views import Cmod
from app.owner_panel.views import Omod
from app.progressive_panel.views import Smod
from instance.config import engine
from sqlalchemy.orm import sessionmaker
app = Flask(__name__,
static_folder='./static',
instance_relative_config=True,
instance_path=r"C:\Users\Orbit\RPOSS\instance")
app.config.from_object('config')
app.config.from_pyfile('config.py')
bcrypt = Bcrypt(app)
Session = sessionmaker(bind=engine)
db_session = Session()
Bootstrap(app)
app.register_blueprint(Cmod)
app.register_blueprint(Rmod, url_prefix="/RPOSS")
app.register_blueprint(Omod, url_prefix="/RPOSS/owner_panel")
app.register_blueprint(Smod, url_prefix="/RPOSS/progressive_panel")
RPOSS/app/views.py
:
from flask import ...
from app.forms import ...
from app.models import ClassName
Rmod = Blueprint('RPOSS', __name__,
template_folder='templates',
static_folder='static')
RPOSS/app/models.py
:
from app import bcrypt
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import ...
Base = declarative_base()
class ClassName(Base):
# I am using bcrypt here to hash values
...
注意:我運行了模型並創建了數據庫,並且一切正常。
Traceback (most recent call last):
File "C:/Users/Orbit/RPOSS/app/models.py", line 1, in <module>
from app import bcrypt
File "C:\Users\Orbit\RPOSS\app\__init__.py", line 7, in <module>
from app.views import Rmod
File "C:\Users\Orbit\RPOSS\app\views.py", line 3, in <module>
from app.models import Employee
File "C:\Users\Orbit\RPOSS\app\models.py", line 1, in <module>
from app import bcrypt
ImportError: cannot import name 'bcrypt'
有人可以幫我弄清楚發生了什么嗎?
您有一個循環導入。
app.models
嘗試導入app
以解析名稱bcrypt
:
File "C:/Users/Orbit/RPOSS/app/models.py", line 1, in <module>
from app import bcrypt
app/__init__.py
文件首先導入另一個模塊,但是app.views
:
File "C:\Users\Orbit\RPOSS\app\__init__.py", line 7, in <module>
from app.views import Rmod
這個模塊想從app.models
導入:
File "C:\Users\Orbit\RPOSS\app\views.py", line 3, in <module>
from app.models import Employee
這是您開始使用的文件,但是您可能將其作為腳本運行,因此被Python導入為__main__
,這意味着Python將再次使用app.model
名稱將其導入。
但是現在您遇到了一個問題,因為它再次導入了app
:
File "C:\Users\Orbit\RPOSS\app\models.py", line 1, in <module>
from app import bcrypt
此時, app
已經創建,但尚未完成導入。 名稱bcrypt
尚未分配。
在導入app.model
之前,需要將名稱bcrypt
移至一行。 將行from app.views import Rmod
移動到bcrypt = Bcrypt(app)
行下方 ,或稍后使用單獨的函數導入藍圖。
我更喜歡使用Application Factory來設置應用程序和藍圖。 更改__init__
方法以在工廠函數中導入藍圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.