背景:某个租户下有200万条虚机的脏数据记录要删除,可以通过虚机的id进行删除。
1) 查询某个租户下虚机id的接口 post /api/v1/{tenant-id}/all_vms
响应体 [vmid1,vmid2,vmid3]
2) 删除虚机的接口 delete /api/v1/vm
Python实现脚本
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import json
def get_vm_id_req():
vmid_req={
"create_time": 20200101,
"vm_status":"active"
}
return vmid_req
def get_vm_id():
req_url= "http://ip:port/api/v1/88888/all_vms"
req_header={}
req_header["Content-type"]= "application/json"
req_header["cookie"]="username=robot, token=zsmtxmzsmtxm202007"
resp= requests.post(req_url, header= req_header,data=json.dumps(vmid_req), verify=False)
print (resp.content) #打印响应内容
print (resp.status_code)
with open('vm_id.json' , 'w', encoding= 'utf-8') as file_obj:
file_obj.write(json.dumps( resp.content))
file_obj.close()
def delete_vmid_req():
with open('vm_id.json' ,'r', encoding='utf-8') as file_obj:
vmid=json.loads( file_obj.read())
del_vmid_req={
"vmid": vmid
}
def delete_vm_id():
req_url= "http://ip:port/api/v1/vm"
req_header={}
req_header["Content-type"]= "application/json"
req_header["cookie"]="username=robot, token=zsmtxmzsmtxm202007"
resp= requests.deletet(req_url, header= req_header,data=json.dumps(del_vmid_req))
print (resp.content) #打印响应内容
print (resp.status_code)
if __name__ == "__main__":
get_vm_id(get_vm_id_req())
delete_vm_id(delete_vmid_req())
执行命令 python3 delete-vm.py
requests类库使用说明
1. Requests简单使用说明
# 导入 Requests 模块:
>>> import requests
# 初始化一个叫 r 的Response对象。从这个对象中获取所有想要的信息。
>>> r = requests.get('https://api.git.com/')
发送一个 HTTP POST请求:
>>> r = requests.post('http://httpbin.org/', data = {'key':'value'})
发送一个 HTTP PUT请求:
>>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
发送一个 HTTP delete请求:
>>> r = requests.delete('http://bin.org/del')
发送一个 HTTP head请求:
>>> r = requests.head('http://bin.org/get')
发送一个 HTTP options请求:
>>> r = requests.options('http://bin.org/get')
以字节的方式获取请求响应体:r.content
requests内置的JSON解码器: r.json()
获取响应码:r.status_code
以字典形式获取响应头:r.headers
2. 传递 URL 参数
Requests 允许使用 params关键字参数,以一个字符串字典来提供这些参数。
>>> payload = {'key': 'value', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=payload)
3. 原始响应内容(流数据下载)
在罕见的情况下,可能想获取来自服务器的原始套接字响应,那么可以访问 r.raw。 请确保在初始请求中设置了stream=True:
>>> r = requests.get('https://github.com/', stream=True)
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
一般情况下,将文本流保存到文件:
with open(filename, 'wb') as fd:
for chunk in r.iter_content(chunk_size):
fd.write(chunk)
使用Response.iter_content将会处理大量直接使用Response.raw不得不处理的。 当流下载时,上面是优先推荐的获取内容方式。
4. 定制请求头
#为请求添加 HTTP 头部
>>> url = 'https://api.github.com/endpoint'
>>> headers = {'user-agent': 'my-app/0.0.1'}
>>> r = requests.get(url, headers=headers)
注意: 定制 header 的优先级低于某些特定的信息源,例如:
如果在 .netrc中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了auth= 参数,``.netrc`` 的设置就无效了
如果被重定向到别的主机,授权 header 就会被删除。
代理授权 header 会被 URL 中提供的代理身份覆盖掉。
在判断内容长度的情况下,header 的 Content-Length 会被改写。
进一步讲,Requests不会基于定制header的具体情况改变自己的行为。不过在最后的请求中,所有的header信息都会被传递进去。
注意: 所有的header值必须是string、bytestring或者unicode。尽管传递unicode header也是允许的,但不建议这样做。
5. 重定向与请求历史
默认情况下,除了HEAD外,Requests会自动处理所有重定向。
可以使用响应对象的 history 方法来追踪重定向。Response.history 是一个Response对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最老到最近的请求进行排序。
如果使用的是GET、OPTIONS、POST、PUT、PATCH 或者 DELETE,那么可以通过 allow_redirects 参数禁用重定向处理:
>>> r = requests.get('http://github.com', allow_redirects=False)
>>> r.status_code
301
>>> r.history
[]
如果使用了 HEAD,可以启用重定向:
>>> r = requests.head('http://github.com', allow_redirects=True)
>>> r.url
'https://github.com/'
>>> r.history
[<Response [301]>]
6. 超时
requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应:
>>> requests.get('http://github.com', timeout=0.001)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
注意:timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)。