2015-09-05 97 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