这样做没有意义。您可以继承 Flask 以更改其内部行为,而不是将您的路由定义为类方法。
相反,您正在寻找blueprints 和app 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)不起作用的原因是因为它是一个实例方法,但在定义类时没有实例。