在IPython笔记本单元运行之前运行代码

在IPython笔记本单元运行之前运行代码,ipython,ipython-notebook,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 = Flas

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


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

每次调用app=Flask(“Flask\u模块”)时,您都在创建一个新的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)
/塔吉塔将返回404

如果这是您想要的行为,即每个单元格都应该是独立的烧瓶端点,那么您可以通过创建自己的装饰器来实现这一点,该装饰器为您装饰的任何功能创建一个新的应用程序对象,如下所示:

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)
@route('/targeta')
def targeta():
    return 'targeta'
如果允许您查找的行为多次使用@app.route而不接收断言错误,您可以创建自己的装饰程序,调用add_url_规则并接受异常:

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
在这两种情况下,您将按照以下方式装饰您的功能:

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)
@route('/targeta')
def targeta():
    return 'targeta'

假设您这样做是出于教程或演示的目的,那么您需要将装饰代码放在笔记本的设置部分,这样就可以清楚地了解您为什么这样做。

请澄清,您的每个单元格是否也执行app.run(…)?或者你有很多单元格,每个单元格都包含@app.route(…),最后一个单元格包含app.run(…)?目前每个单元格都包含app.run,这样我就可以独立运行它们了。一个更好的办法是在底部有一个单元格,可以运行所有内容,但我不想跳转。。