2016-02-28 61 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中经常出现。 –

相关问题