您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

将Flask类扩展为主应用

将Flask类扩展为主应用

这样做是没有意义的。你将创建子类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)无法使用的原因是因为它是一个实例方法,但是在定义类时没有实例。

Python 2022/1/1 18:19:21 有612人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶