2016-02-28 60 views
1

我正在按照本教程的說明在Flask中使用Python 2.7構建用戶登錄系統。如何使「從目錄導入外部目錄」在Python中工作?

Intro to Flask: Signing In and Out

我有這個瓶的應用程序結構。

flaskapp/ 
└── app/ 
     ├── user/ 
     │  ├── __init__.py 
     │  ├── static/ 
     │  ├── templates/ 
     │  ├── forms.py 
     │  ├── routes.py 
     └── runserver.py 

在教程中,我要編輯這個文件。

app/intro_to_flask/routes.py 

在該文件中您已有此代碼。

from user import app 
from flask import render_template, request, flash 
from forms import ContactForm 
from flask.ext.mail import Message, Mail 

mail = Mail() 
. 
. 
. 
# @app.route() mappings start here 

我得到這個錯誤。

ImportError: cannot import name app 

這就是說,我不能從用戶導入應用程序。我已經試過:

from . import app 

我真的不知道該如何解釋這裏的問題,但我的編輯正試圖在其內部導入外部目錄的用戶目錄中的Python文件?如果應用程序目錄不在用戶目錄中,您如何從用戶導入應用程序中執行操作?我在這裏錯過了什麼?

在runserver.py中,我能夠做到這一點,因爲我認爲runserver.py存在於app目錄中。儘管如此,我無法在routes.py中執行此操作。

如果我無法導入應用程序,我不能在瓶定義路由這樣:

@app.route('/') 
def index(): 
    return "Testing route!" 
+0

@gddc - 我不知道相信這是重複的。這個問題與相對導入無關。所討論的變量實際上需要在'__init __。py'中定義,我懷疑它已經關閉了,或者使用了與本教程中使用的名稱不同的名稱。我認爲,進口是正確的。 – ArtOfWarfare

+1

嘗試'導入用戶;打印(用戶)'在你的腳本中,在失敗的行之前。發佈它在這裏打印的內容 - 可能會讓我們對發生的事情有更多的瞭解。 – ArtOfWarfare

+0

@ArtOfWarfare:<從模塊「用戶」「... \ PycharmProjects \ flaskapp \程序\用戶\ __ __初始化PYC。」> – Fastidious

回答

2

在您鏈接到本教程,app__init__.py文件中定義的,就像這樣:

from flask import Flask 

app = Flask(__name__) 
# ... The tutorial has a lot more below this, too - it's all probably important. 

模塊中名爲app的變量(在本教程中稱爲intro_to_flask,您的情況稱爲user)與名爲app的文件夾無關。

__init__.py有正確的內容,我認爲這會奏效。

+0

我的__init__.py文件確實包含Flask模塊並定義了app = Flask(__ name__)。它仍然無法從用戶內部導入應用程序。 – Fastidious

+0

謝謝ArtOfWarfare。從技術上講,你對init.py文件沒有正確的內容是正確的。我會在這裏給你正確的答案,因爲這導致我按照進口順序找出問題。我想這是一個輕微的忽視,但我仍然是一個小菜鳥。 – Fastidious

0

這是您理解Python打包和導入系統如何工作的問題(據我所知)。你引用的教程使用了一個更簡單的結構(兩個文件中的所有內容)。

我會簡化你的結構到一個包(文件夾)與幾個文件(模塊)。以下是進口的工作方式。

from x import y是 「從[該模塊或封裝]進口[東西]」

模塊=一個文件

的包裝=一個文件夾(與__init__.py文件中它** REQUIRED)

您不能讓一個模塊從其無法觸及的模塊導入某些東西。 (即它不能找到一個包)

你也不能有圓形進口。如:

from x import y 
a = 1 

# ... and then inside x.py 

from z import a 

不起作用。

希望這會幫助你找出你的進口問題的具體情況。

+0

啊,你說得對。我想它試圖從init.py文件中導入應用程序,其中app = Flask()被定義。我如何將app = Flask()從init.py導入到routes.py文件中? – Fastidious

+0

'from intro_to_flask import app' –

+0

然後就是這個問題。從intro_to_flask導入應用程序失敗,即使intro_to_flask內init.py文件的應用程序定義爲應用=瓶進口的應用程序在routes.py() – Fastidious

0

回答我的問題在這裏。

的問題是進口秩序。我使用一種名爲PyCharm的流行IDE,遵循PEP 8標準。它在重構過程中將導入置於文件的頂部,導致應用程序在導入時失敗。

這是我init.py文件的原始代碼被重構(PEP 8):

from flask import Flask 
from routes import mail 
import user.routes 

app = Flask(__name__) 

app.secret_key = 'development key' 

app.config["MAIL_SERVER"] = "smtp.gmail.com" 
app.config["MAIL_PORT"] = 465 
app.config["MAIL_USE_SSL"] = True 
app.config["MAIL_USERNAME"] = 'removed' 
app.config["MAIL_PASSWORD"] = 'removed' 

mail.init_app(app) 

正確的代碼,解決了這一問題:

from flask import Flask 

app = Flask(__name__) 

app.secret_key = 'development key' 

app.config["MAIL_SERVER"] = "smtp.gmail.com" 
app.config["MAIL_PORT"] = 465 
app.config["MAIL_USE_SSL"] = True 
app.config["MAIL_USERNAME"] = 'removed' 
app.config["MAIL_PASSWORD"] = 'removed' 

from routes import mail 
mail.init_app(app) 

import user.routes 
+1

高興你理解了它。這是循環導入的情況,這個問題在Python中經常出現。 –

相關問題