我正在学习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'
。我想这不是我构建应用程序的方式。我应该怎么做呢或如何修复错误?
答案 0 :(得分:6)
这样做没有意义。您可以将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()
使用以下命令运行dev服务器:
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
)之所以不起作用,是因为它是一种实例方法,但是当你没有实例时,你就没有实例。重新定义班级。