我正在写一堆如何使用Flask
的例子,目前我希望能够写出来
@app.route("/")
def redirectora():
redirect("redirected")
@app.route("/targeta", methods=["GET", "POST"])
def redirecteda():
return "Redirected!"
app.run(host="0.0.0.0", port=5000)
在我的单元格中,但我必须包括
app = Flask("the_flask_module")
在每个单元格中(否则,如果我运行单元格两次,则会出现关于尝试添加路由两次的断言错误。)
我真的希望能够在单元格运行之前运行代码(所以我不必写app =
60次)但是我找不到笔记本的任何信号或挂钩。
有没有人知道在运行任何单元格之前如何运行代码?
答案 0 :(得分:0)
每当您拨打app = Flask(' the_flask_module')时,您都会创建一个新的Flask应用实例。如果你在每个单元格的顶部都有这个,那么每次执行一个单元格时,你都会消灭掉之前的Flask应用程序实例。例如,如果您这样做:
app = Flask('my_app')
@app.route('/targeta')
def targeta():
return 'targeta'
app = Flask('my_app')
@app.route('/targetb')
def targeta():
return 'targetb'
app.run(host="0.0.0.0", port=5000)
/ targeta将返回404。
如果这是您想要的行为,即每个单元格应该是一个独立的Flask端点,那么您可以通过创建自己的装饰器来实现这一点,该装饰器为您装饰的任何函数创建一个新的app对象,如下所示:
class route(object):
def __init__(self, path, **kwargs):
self.path = path
self.kwargs = kwargs
def __call__(self, func):
app = Flask('my_flask_app')
app.add_url_rule(self.path, func.func_name, func, **self.kwargs)
app.run(host="0.0.0.0", port=5000)
如果您要查找的行为不允许多次使用@ app.route而没有收到断言错误,您可以创建自己的装饰器来调用add_url_rule并吞下异常:
class route(object):
def __init__(self, path, **kwargs):
self.path = path
self.kwargs = kwargs
def __call__(self, func):
try:
app.add_url_rule(self.path, func.func_name, func, **self.kwargs)
except AssertionError, e:
pass
在这两种情况下,您都会按如下方式修饰您的函数:
@route('/targeta')
def targeta():
return 'targeta'
假设您出于教学或演示目的而进行此操作,您将要将装饰器代码放在笔记本的设置部分中,以便它是透明的,为什么您已完成此操作。