将Flask类扩展为主应用

我正在学习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’。我想这不是我应该构建应用程序的方式。我应该怎么做,或者如何解决错误?

回答:

这样做是没有意义的。你将创建子类Flask以更改其内部行为,而不是将路由定义为类方法。

相反,你正在寻找蓝图和应用程序工厂模式。蓝图将视图划分为多个组,而无需使用任何应用程序,并且只有在调用时,工厂才会创建和设置应用程序。

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')

如果你真的要定义路线的瓶子类的方法,你需要使用self.add_url_rule的__init__,而不是局部装饰每条路线。

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)无法使用的原因是因为它是一个实例方法,但是在定义类时没有实例。

以上是 将Flask类扩展为主应用 的全部内容, 来源链接: utcz.com/qa/414522.html

回到顶部