【问题标题】:Extending Flask class as main App将 Flask 类扩展为主 App
【发布时间】:2016-08-30 15:57:10
【问题描述】:

我正在学习 Flask,对如何构建我的代码有点困惑。所以我尝试如下扩展 Flask 主类:

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' 的错误。我想这不是我构建应用程序的方式。我应该怎么做,或者如何修复错误?

【问题讨论】:

    标签: python flask


    【解决方案1】:

    这样做没有意义。您可以继承 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')
    

    如果您真的想将路由定义为 Flask 子类的方法,则需要在 __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)不起作用的原因是因为它是一个实例方法,但在定义类时没有实例。

    【讨论】:

      猜你喜欢
      • 2015-05-12
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 2013-04-27
      • 2017-04-04
      • 1970-01-01
      • 2016-09-27
      相关资源
      最近更新 更多