有人能帮我理解各种方法之间的区别吗:
request.bounded_stream.read()
request.stream.read()
request.get_media()
它们似乎做了同样的事情,但使用stream或bounded_stream提供了一个类似字节的对象。
class test_dev(object):
async def on_post(self, request, response):
obj = await request.bounded_stream.read()
print(obj)
class test_dev(object):
async def on_post(self, request, response):
obj = await request.stream.read()
print(obj)
class test_dev(object):
async def on_post(self, request, response):
obj = await request.get_media()
print(obj)
stream
和bounded_stream
是类似文件的包装器,用于访问来自服务器的请求体数据流。这些是不可搜索的,据我所知,也不可能偷看它们。
它们之间的区别在于后者绑定到请求的content_length
,其中stream
的行为可能因系统而异。这在官方文件中有详细说明。
至于get_media()
,它是media
属性的包装器。从文档中,您可以阅读:
警告:
此操作将在第一次调用请求流时使用请求流并缓存结果。后续调用将只检索对象的缓存版本。
因此,第一次访问request.media
时,请求流被消耗并缓存,这意味着从stream
和bounded_stream
上的那一刻起,将返回空数据流。默认情况下,应用程序将假定内容类型为application/json
,并使用json
库对内容进行序列化和反序列化。
从文档中不太清楚的是,如果您选择访问并因此消费stream
或bounded_stream
,那么访问media
将返回错误。如果您选择自己访问stream
或bounded_stream
,您还必须自己存储数据。