2015-09-05 100 views
0

我试图将一个小应用程序分解为单元并在烧瓶中使用Blueprint模式。不过,我似乎无法让应用程序运行。使用蓝图构造烧瓶错误

这里是我的结构:

\myapp 
    login.py 
    \upload 
    __init__.py 
    views.py 

这里是login.py:

import sys, os 
from flask import Flask, Blueprint, request 
from flask import render_template, session 
from .upload import views 


app = Flask(__name__) 
app.register_blueprint(views) 

@app.route('/') 
def index(): 
    return render_template('index.html') 

if __name__ == '__main__': 
    print app.url_map 
    print app.blueprints 
    app.run(debug = True) 

__init__.py

from flask import Flask 
    app.register_blueprint('upload', __name__) 

和views.py

from flask import Flask, Blueprint, request, redirect, url_for, render_template 
import views 

upload = Blueprint('upload', __name__) 

@upload.route('/uploaded', methods=['GET', 'POST']) 
def upload_file(): 
    ... 
在在Heroku上的日志

来看,这里是错误:

from .upload import views 
2015-09-05T10:59:00.506513+00:00 app[web.1]: ValueError: Attempted relative import in non-package 

有一个结构化的我的包和蓝图是否正确?我使用了文档,但我想我在这里错过了一些东西。

回答

2

有三个问题与您的代码:

  • 您使用的是相对进口在login.py包括views,但考虑到文件夹结构,并且使用的login.py为出发点的事实,就不能在这里工作。改为使用from upload import views
  • __init__.py引用未知变量,app。你实际上不需要这个文件中的任何东西,删除所有东西。
  • 您尝试在login.py中通过app.register_blueprint(views)将模块注册为蓝图。这是行不通的,一个模块不是蓝图。相反,导入views模块中定义的upload变量,即蓝图:app.register_blueprint(views.upload)

改变这应该让你开始。两面注意事项:

  • 您有一个进口views.py,应该可能不存在:import views。然而,这应该是无害的。
  • 几天前我回答了关于烧瓶蓝图的问题,并举例说明了如何使用它们。也许你会发现the answer也适用于你的情况(特别是蓝图定义移至定义蓝图的__init__.py文件的部分)。
+0

我做了这些变化,但现在我得到的问题:如果blueprint.name在self.blueprints: AttributeError的:“功能”对象有没有属性“名” – disruptive

+0

看来蓝图不能相同的名称作为模块? – disruptive

+1

嗯,疯狂猜测:你没有在'views.py'文件(在你的问题中复制的部分下面)有一个名为'upload'的函数,它会覆盖文件开始处定义的'upload'蓝图? – Nicolas