gpt4 book ai didi

python - Flask 资源何时创建?

转载 作者:行者123 更新时间:2023-12-02 04:22:44 24 4
gpt4 key购买 nike

我是 Flask 新手。我有一个处理 POST 请求的资源类。请求处理相当复杂,不可能全部集中在 post 函数中。我是否会为每个请求获得一个新的资源实例?或者实例是否被重用?我做这样的事情安全吗:

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

Flask 是否保证我的资源实例不会用于其他事务?

最佳答案

资源对象是在请求被服务时创建的,并且它们不是持久的。请记住,REST 原则规定 API 必须是 stateless 。如果您想在请求之间存储数据,您应该使用某种数据库。

证明我所说的最简单的方法是在 get 处理程序中使用 print (id(self)) 并触发几次请求。您将看到该对象始终在变化。

现在,如果您对Flask 内部结构感兴趣,我们就开始吧。资源类是 Flask-RESTtful 的一部分文档说明如下:

Resources are built on top of Flask pluggable views, giving you easy access to multiple HTTP methods just by defining methods on your resource.

使用方法 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)

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

最后,我们到达了核心,即 View.as_view()方法,它会动态创建一个函数,该函数将代表路由处理程序。

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

正如您所看到的,每次必须分派(dispatch)请求时,此函数都会创建一个新对象,并且正如您已经猜到的那样,view_class 包含用于处理请求的自定义类。

关于python - Flask 资源何时创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59786278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com