2016-08-30 70 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)将行不通,是因为它是一个实例方法,但是你没有一个实例,当你定义的类。