是否可以在Flask中使用路线标记方法?

时间:2016-10-04 13:28:07

标签: python python-3.x flask

可以继承Flask

from flask import Flask

class MyServer(Flask):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def my_cool_method(self):
        print("About to do some crazy productive work!")

通过这样做,可以创建一个MyServer对象并定义一个路由,当被命中时,它会调用一个方法。

my_server = MyServer(__name__)

@my_server.route("/my_cool_endpoint")
def my_cool_endpoint():
    my_server.my_cool_method()

是否有任何可能的方法来删除这个看似不必要(并且相当不可持续)的步骤并简单地用路径装饰方法

我的伪代码就像......

#!/usr/bin/env python3

from flask import Flask

class MyServer(Flask):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    @self.route("/my_cool_endpoint")
    def my_cool_method(self):
        print("About to do some crazy productive work!")

if __name__ == "__main__":
    my_server = MyServer(__name__)
    # We can now hit 127.0.0.1:8080/my_cool_endpoint... hopefully
    my_server.run(port=8080)

我的动机是简单地run对象并让端点受到攻击,修改每个API调用中对象的状态。

如果这与我所描述的完全不同,那么实现目标的最不可取的方式是什么?

1 个答案:

答案 0 :(得分:0)

routeFlask类的一个方法,因此它实际上需要将app实例作为第一个参数(当你执行@app.route时传入它)。由于类的所有方法(装饰或非装饰)都在“编译”时进行评估,因此无法按照您描述的方式(或可能,但需要一些严重的魔法)来完成。你可以随时做:

class MyApp(Flask):
    def __init__(self, *args, **kwargs):
        self.count = 0
        super(MyApp, self).__init__(*args, **kwargs)

        @self.route('/')
        def index():
            self.count += 1
            print self.count
            return 'foo'
由于形成了封闭,

self可以引用与self中相同的__init__

但由于Flask的context locals,将状态保存在Flask中的对象并不是那么好。改为使用会话。

另外,我认为你所寻求的是class-based views