Make a Request

  1. import aiohttp
  2. async with aiohttp.ClientSession() as session:
  3. async with session.get('https://api.github.com/events') as resp:
  4. print(resp.status)
  5. print(await resp.text())
  6. session.post('http://httpbin.org/post', data=b'data')
  7. session.put('http://httpbin.org/put', data=b'data')
  8. session.delete('http://httpbin.org/delete')
  9. session.head('http://httpbin.org/get')
  10. session.options('http://httpbin.org/get')
  11. session.patch('http://httpbin.org/patch', data=b'data')
  1. aiohttp.ClientSession.get(self, url, allow_redirects=True, **kwargs)
  2. aiohttp.ClientSession.post(self, url, data=None, **kwargs)
  3. aiohttp.ClientSession.put(self, url, data=None, **kwargs)
  4. aiohttp.ClientSession.delete(self, url, **kwargs)
  5. aiohttp.ClientSession.head(self, url, allow_redirects=False, **kwargs)
  6. aiohttp.ClientSession.options(self, url, allow_redirects=True, **kwargs)
  7. aiohttp.ClientSession.patch(self, url, data=None, **kwargs)
  8. # 无须为每个request建立session. 仅需要为每个application建立session供所有request使用. session内部包含连接池,connection复用与长连接加速总性能。

Passing Parameters In URLs

  1. # 字典
  2. params = {'key1': 'value1', 'key2': 'value2'}
  3. async with session.get('http://httpbin.org/get', params=params) as resp:
  4. assert str(resp.url) == 'http://httpbin.org/get?key2=value2&key1=value1'
  5. # 数组
  6. params = [('key', 'value1'), ('key', 'value2')]
  7. async with session.get('http://httpbin.org/get', params=params) as r:
  8. assert str(r.url) == 'http://httpbin.org/get?key=value2&key=value1'
  9. # 字符串
  10. async with session.get('http://httpbin.org/get', params='key=value+1') as r:
  11. assert str(r.url) == 'http://httpbin.org/get?key=value+1'
  12. # aiohttp在发送请求前在内部自动对url进行转码,如URL('http://example.com/путь%30?a=%31') -> URL('http://example.com/%D0%BF%D1%83%D1%82%D1%8C/0?a=1')
  13. # 使用encoded=True开关禁用, 如await session.get(URL('http://example.com/%30', encoded=True))

Response Content and Status Code

  1. async with session.get('https://api.github.com/events') as resp:
  2. print(resp.status)
  3. print(await resp.text())
  1. # out
  2. 200
  3. '[{"created_at":"2015-06-12T14:06:22Z","public":true,"actor":{... '
  4. # aiohttp自动对服务端返回的内容进行decode.可以使用text()方法自定义encode,如 await resp.text(encoding='windows-1251')

Binary Response Content

  1. async with session.get('https://api.github.com/events') as resp:
  2. print(await resp.read())
  1. # out
  2. b'[{"created_at":"2015-06-12T14:06:22Z","public":true,"actor":{... ]'
  3. # gzip和deflate压缩算法,自动解码。brotli压缩算法需要安装 brotlipy 模块

JSON Request

  1. async with aiohttp.ClientSession() as session:
  2. async with session.post(url, json={'test': 'object'})

默认使用标准库json进行序列化,如果想快一点的话,可以使用第三方库ujson,但小小的不兼容

  1. import ujson
  2. async with aiohttp.ClientSession(json_serialize=ujson.dumps) as session:
  3. async with session.post(url, json={'test': 'object'})

JSON Response Content

  1. async with session.get('https://api.github.com/events') as resp:
  2. print(await resp.json())
  3. # 如果json解析失败,会抛出异常

Streaming Response Content

  1. async with aiohttp.StreamReader() as session:
  2. async with session.get('https://api.github.com/events') as resp:
  3. await resp.content.read(10)
  4. # read(), json(),text()将内容放在内存中,如果文件内容比较大,1G以上,需要使用 aiohttp.StreamReader 替代,它会对gzip和deflate压缩算法自动解码
  1. with open(filename, 'wb') as fd:
  2. while True:
  3. chunk = await resp.content.read(chunk_size)
  4. if not chunk:
  5. break
  6. fd.write(chunk)
  7. # 写入文件

More complicated POST requests

  1. payload = {'key1': 'value1', 'key2': 'value2'}
  2. async with session.post('http://httpbin.org/post',
  3. data=payload) as resp:
  4. print(await resp.text())
  1. # form-encoded data (HTML form), 使用字典,字典数据自动编码为form-encoded
  2. {
  3. ...
  4. "form": {
  5. "key2": "value2",
  6. "key1": "value1"
  7. },
  8. ...
  9. }
  1. async with session.post(url, data=b'\x00Binary-data\x00') as resp:
  2. ...
  3. # 非 form-encoded数据使用bytes类型,数据发送默认使用content-type ‘application/octet-stream’
  1. async with session.post(url, json={'example': 'test'}) as resp:
  2. ...
  3. # josn类型
  1. async with session.post(url, text='Тест') as resp:
  2. ...
  3. # content-type text类型

POST a Multipart-Encoded File

  1. url = 'http://httpbin.org/post'
  2. files = {'file': open('report.xls', 'rb')}
  3. await session.post(url, data=files)
  1. url = 'http://httpbin.org/post'
  2. data = FormData()
  3. data.add_field('file',
  4. open('report.xls', 'rb'),
  5. filename='report.xls',
  6. content_type='application/vnd.ms-excel')
  7. await session.post(url, data=data)
  8. # 上传文件对象,aiohttp使用stream

Streaming uploads

  1. with open('massive-body', 'rb') as f:
  2. await session.post('http://httpbin.org/post', data=f)
  3. # 文件类型过大,使用Stream方式
  1. @aiohttp.streamer
  2. def file_sender(writer, file_name=None):
  3. with open(file_name, 'rb') as f:
  4. chunk = f.read(2**16)
  5. while chunk:
  6. yield from writer.write(chunk)
  7. chunk = f.read(2**16)
  8. # Then you can use file_sender as a data provider:
  9. async with session.post('http://httpbin.org/post',
  10. data=file_sender(file_name='huge_file')) as resp:
  11. print(await resp.text())
  1. async def feed_stream(resp, stream):
  2. h = hashlib.sha256()
  3. while True:
  4. chunk = await resp.content.readany()
  5. if not chunk:
  6. break
  7. h.update(chunk)
  8. stream.feed_data(chunk)
  9. return h.hexdigest()
  10. resp = session.get('http://httpbin.org/post')
  11. stream = StreamReader()
  12. loop.create_task(session.post('http://httpbin.org/post', data=stream))
  13. file_hash = await feed_stream(resp, stream)
  1. r = await session.get('http://python.org')
  2. await session.post('http://httpbin.org/post', data=r.content)

WebSockets

  1. session = aiohttp.ClientSession()
  2. async with session.ws_connect('http://example.org/websocket') as ws:
  3. async for msg in ws:
  4. if msg.type == aiohttp.WSMsgType.TEXT:
  5. if msg.data == 'close cmd':
  6. await ws.close()
  7. break
  8. else:
  9. await ws.send_str(msg.data + '/answer')
  10. elif msg.type == aiohttp.WSMsgType.CLOSED:
  11. break
  12. elif msg.type == aiohttp.WSMsgType.ERROR:
  13. break

Timeouts

  1. async with session.get('https://github.com', timeout=60) as r:
  2. ...
  3. # 默认IO操作延时5分钟,None 或者 0 禁用延时
  1. # 使用async_timeout模块
  2. import async_timeout
  3. with async_timeout.timeout(0.001):
  4. async with session.get('https://github.com') as r:
  5. await r.text()

aiohttp模块1 client的更多相关文章

  1. SocketServer模块,hmac模块验证client合法性

    hmac模块: 1.模块初识: import hmac # h = hmac.new() #括号里要给它连个bytes类型,一个是自定义的secret_key,一个是你想进行加密的bytes # 密文 ...

  2. Python学习---IO的异步[asyncio +aiohttp模块]

    aiohttp aiohttp是在asyncio模块基础上封装的一个支持HTTP请求的模块,内容比8.4.2[基于asyncio实现利用TCP模拟HTTP请求]更全面 安装aiohttp: pip3 ...

  3. Python3中的http.client模块

    http 模块简介 Python3 中的 http 包中含有几个用来开发 HTTP 协议的模块. http.client 是一个底层的 HTTP 协议客户端,被更高层的 urllib.request ...

  4. aiohttp 支持异步的网络请求模块

    通常在进行网络数据采集时候我们会用到requests,urllib等模块,但是这些模块在使用中并不支持异步,所以今天我们介绍一个支持异步网络请求的模块aiohttp. 首先我们使用flask简单的搭一 ...

  5. python的异步IO模块

    asyncio模块:示例一 import asyncio @asyncio.coroutine def func1(): print('before...func1......') yield fro ...

  6. asynicio模块以及爬虫应用asynicio模块(高性能爬虫)

    一.背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调的是 ...

  7. 爬虫模块之解决IO

    一 asyncio模块 asyncio模块:主要是帮我们检测IO(只能是网路IO). @asyncio.coroutine:装饰器 tasks:任务列表 get_event_loop:起任务 run_ ...

  8. 高性能爬虫——asynicio模块

      一 背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调 ...

  9. 异步网络编程aiohttp的使用

    aiohttp的使用 aiohttp Asynchronous HTTP Client/Server for asyncio and Python. Supports both Client and ...

随机推荐

  1. let 和 var 的区别笔记

    参考文章:阮一峰   ECMAScript 6 入门 ES6中新增加了 let  声明,它跟 var  的区别如下: 1.作用域不同,let  只在代码块中有效 { var a = '123'; le ...

  2. dotnet体系结构

    一.C#与.NET的关系 1.粗略地説,.net是一种在Windows平台上的编程架构————一种API. 2.C#编译器专门用于.net,这表示用C#编写的所有代码总是使用.NET Framewor ...

  3. Emit生成特定接口的类

    参考 动态生成类 http://www w2bc com/Article/44799 http://www.cnblogs.com/yingql/archive/2009/03/24/1420914. ...

  4. js 中的! 和 !! 的区别

    Js中!的用法是比较灵活的,它除了做逻辑运算常常会用!做类型判断,可以用!与上对象来求得一个布尔值,1.!可将变量转换成boolean类型,null.undefined和空字符串取反都为false,其 ...

  5. Python+Selenium定位元素的方法

    Python+Selenium有以下八种定位元素的方法: 1. find_element_by_id() eg: find_element_by_id("kw") 2. find_ ...

  6. JS及Dom练习 | 模态对话框及复选框操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. (Frontend Newbie)Web三要素(三)

    上一篇简单介绍了Web三要素中的层叠样式表,本篇主要介绍三要素中最后一个,也是最难掌握的一个-----JavaScript. JavaScript 老规矩不能破,先简要交代 JavaScript 的历 ...

  8. unity监听键盘按键

    放在Update里面 if (Input.anyKeyDown) { foreach (KeyCode keyCode in Enum.GetValues(typeof(KeyCode))) { if ...

  9. codeigniter读取数据库的公共配置并全局缓存的实现方案

    引言 学习CodeIgniter大概有几天了.从第一天了解后,对CI情有独钟,比较符合我的风格.其实一直以来对框架这块不太敏感.自己长时间的开发,也有一套自己的开发风格和习惯.但是这年头,你说你不会框 ...

  10. jQuery对新添加的控件添加响应事件

    1. 通过id和类控制 <html> <head> <script src="jquery.js"></script> <sc ...