|
|
- """ Payload implemenation for coroutines as data provider.
-
- As a simple case, you can upload data from file::
-
- @aiohttp.streamer
- async def file_sender(writer, file_name=None):
- with open(file_name, 'rb') as f:
- chunk = f.read(2**16)
- while chunk:
- await writer.write(chunk)
-
- chunk = f.read(2**16)
-
- Then you can use `file_sender` like this:
-
- async with session.post('http://httpbin.org/post',
- data=file_sender(file_name='huge_file')) as resp:
- print(await resp.text())
-
- ..note:: Coroutine must accept `writer` as first argument
-
- """
-
- import asyncio
- import warnings
-
- from .payload import Payload, payload_type
-
-
- __all__ = ('streamer',)
-
-
- class _stream_wrapper:
-
- def __init__(self, coro, args, kwargs):
- self.coro = asyncio.coroutine(coro)
- self.args = args
- self.kwargs = kwargs
-
- async def __call__(self, writer):
- await self.coro(writer, *self.args, **self.kwargs)
-
-
- class streamer:
-
- def __init__(self, coro):
- warnings.warn("@streamer is deprecated, use async generators instead",
- DeprecationWarning,
- stacklevel=2)
- self.coro = coro
-
- def __call__(self, *args, **kwargs):
- return _stream_wrapper(self.coro, args, kwargs)
-
-
- @payload_type(_stream_wrapper)
- class StreamWrapperPayload(Payload):
-
- async def write(self, writer):
- await self._value(writer)
-
-
- @payload_type(streamer)
- class StreamPayload(StreamWrapperPayload):
-
- def __init__(self, value, *args, **kwargs):
- super().__init__(value(), *args, **kwargs)
-
- async def write(self, writer):
- await self._value(writer)
|