Flask资源何时创建?

5

我刚接触Flask。我有一个处理POST请求的资源类。请求处理非常复杂,不能全部在post函数中完成。每个请求是否获取新的资源实例?还是实例会被重复使用?类似下面这样的做法是否安全:

class MyResource(Resource):
    def post(self):
        self.var = 17
        self.do_some_work()
        return self.var * self.var

Flask是否保证我的资源实例不会用于其他交易?
1个回答

3

资源对象是在请求应该被处理时创建的,它们不是持久性的。请记住,REST原则要求API必须是无状态的。如果您想在请求之间存储数据,应该使用某种数据库。

证明我所说的最简单的方法是在您的get处理程序中使用print(id(self))并触发请求几次。你会发现对象总是在改变。

现在,如果您对Flask内部感兴趣,我们来看看。 类ResourceFlask-RESTtful的一部分,文档说明如下:

资源建立在Flask可插拔视图之上,只需在资源上定义方法即可轻松访问多个HTTP方法。

资源通过方法Resource.add_resource()添加,它只是注册底层的View对象。

if self.app is not None:
    self._register_view(self.app, resource, *urls, **kwargs)
else:
    self.resources.append((resource, urls, kwargs))

Resource._register_view() 方法做了很多疯狂的事情,但其中最有意义的是这两行代码:

resource_func = self.output(resource.as_view(endpoint, *resource_class_args, **resource_class_kwargs))
...
self.blueprint_setup.add_url_rule(url, view_func=resource_func, **kwargs)

在这里,您可以看到视图对象提供了一个处理程序,它将与URL路径关联。每次向该路由发出HTTP请求时,都会调用此处理程序。

最后,我们来到了核心部分,在View.as_view()方法中,它会即时创建一个函数,该函数将表示路由处理程序。

def view(*args, **kwargs):
    self = view.view_class(*class_args, **class_kwargs)
    return self.dispatch_request(*args, **kwargs)

正如您所看到的,每次需要分派请求时,此函数都将创建一个新对象,而且您已经猜到,view_class 包含用于处理请求的自定义类。

太好了,谢谢。我只想存储请求特定的数据,它可以随着请求结束而消失,因此我不需要任何数据库。 - zmbq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接