2016-08-30 34 views
3

我正在學習燒瓶,並且對如何構造我的代碼有點困惑。所以我試圖擴展燒瓶主類如下:擴展燒瓶類作爲主要應用程序

from flask import Flask, ... 

class App(Flask): 
    def __init__(self, import_name, *args, **kwargs): 
     super(App, self).__init__(import_name, *args, **kwargs) 

請注意,我知道這可能是一個完全錯誤的方法。
所以,當我想啓動應用程序,我做的事:

app = App(__name__) 

if __name__ == '__main__': 
    app.run() 

這樣我可以爲了我在類的方法和途徑,但使用自裝飾時,問題是:

@route('/') 
def home(self, context=None): 
    context = context or dict() 
    return render_template('home.html', **context) 

這會產生一個錯誤unresolved reference 'route'。我想這不是我應該構建應用程序的方式。我應該怎麼做,或者我如何解決這個錯誤?

回答

5

這樣做沒有意義。您可以繼承Flask以更改其內部行爲,而不是將類路徑定義爲類方法。

相反,您正在尋找blueprintsapp factory pattern。藍圖將您的視圖分成多個組,不需要應用程序,工廠僅在被調用時創建和設置應用程序。

my_app/users/__init__.py

from flask import Blueprint 

bp = Blueprint('users', __name__, url_prefix='/users') 

my_app/users/views.py

from flask import render_template 
from my_app.users import bp 

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

my_app/__init__.py

def create_app(): 
    app = Flask(__name__) 
    # set up the app here 
    # for example, register a blueprint 
    from my_app.users import bp 
    app.register_blueprint(bp) 
    return app 

run.py

from my_app import create_app 

app = create_app() 

與運行開發服務器:

FLASK_APP=run.py 
FLASK_DEBUG=True 
flask run 

如果您需要訪問應用程序的視圖中,使用current_app,就像request可以訪問視圖的請求。

from flask import current_app 
from itsdangerous import URLSafeSerializer 

@bp.route('/token') 
def token(): 
    s = URLSafeSerializer(current_app.secret_key) 
    return s.dumps('secret') 

如果你真的定義路線爲:燒瓶子類的方法,你需要在__init__使用self.add_url_rule而不是在本地裝飾每條路線。

class MyFlask(Flask): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs): 
     self.add_url_rule('/', view_func=self.index) 

    def index(self): 
     return render_template('index.html') 

原因route(和self)將行不通,是因爲它是一個實例方法,但是你沒有一個實例,當你定義的類。