资源对象是在请求应该被处理时创建的,它们不是持久性的。请记住,REST原则要求API必须是无状态的。如果您想在请求之间存储数据,应该使用某种数据库。
证明我所说的最简单的方法是在您的get处理程序中使用print(id(self))
并触发请求几次。你会发现对象总是在改变。
现在,如果您对Flask内部感兴趣,我们来看看。
类Resource是Flask-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
包含用于处理请求的自定义类。