可以继承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调用中对象的状态。
如果这与我所描述的完全不同,那么实现目标的最不可取的方式是什么?
答案 0 :(得分:0)
route
是Flask
类的一个方法,因此它实际上需要将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