在运行IPython Notebook单元格之前运行代码

时间:2015-09-05 22:03:57

标签: ipython ipython-notebook

我正在写一堆如何使用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次)但是我找不到笔记本的任何信号或挂钩。

有没有人知道在运行任何单元格之前如何运行代码?

1 个答案:

答案 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'

假设您出于教学或演示目的而进行此操作,您将要将装饰器代码放在笔记本的设置部分中,以便它是透明的,为什么您已完成此操作。