簡體   English   中英

Flask ImportError:無法導入名稱”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM