Python 杂记: http request (以管理 Vultr 主机为例)
简介
Python 标准库中提供了诸如 urllib.request、http.client 等模块用于发送 HTTP 请求,它们功能强大,但是使用起来并不简洁明了。
requests 是一个第三方模块,比 Python 标准库中提供的简单优雅多了,正如其介绍所说的是为人类而造的(讽刺标准库中的实现不够简单好用):
Requests is an elegant and simple HTTP library for Python, built for human beings.
本文主要介绍 requests 的常用方法,使用它之前需要安装该模块:
pip install requests
文档链接:
- Requests: HTTP for Humans
- urllib.request — Extensible library for opening URLs
- http.client — HTTP protocol client
Hello world!
最简单示例:
import requests resp = requests.get('http://www.example.com/user') resp = requests.post('http://www.example.com/user') resp = requests.put('http://www.example.com/user/put') resp = requests.delete('http://www.example.com/user/delete')
后面会以管理 Vultr 主机为例详细介绍 get()、post() 等方法。
Vultr API 简介
本文将通过使用 vultr.com 提供的 REST API 来管理 Vultr 云服务器为例来介绍 requests 的用法。
注:对本人来讲,购买 vultr.com 云主机器最划算的地方在于:它是按小时扣费的,所以可以同时创建多台主机用于测试,完了就把他们销毁,一台一小时只需要一美分,不到一毛钱人民币。
Vultr API 官方文档链接:https://www.vultr.com/api/。
使用 Vultr API 前需要到个人账户的 API 设置中去开启 API 功能,然后会生成一个 API Key 值会在后面用到,同时指定允许使用的 IP 地址(或者直接点击 Allow all IPv4)。
常用操作(请自行替换 YOURKEY 为你的 API Key 值):
查看当前你已经创建的云主机:
curl -H 'API-Key: YOURKEY' https://api.vultr.com/v1/server/list
创建一台云主机:
curl -H 'API-Key: YOURKEY' https://api.vultr.com/v1/server/create --data 'DCID=2' --data 'VPSPLANID=201' --data 'OSID=167'
其中:
- DCID=2 表示选择主机地址位于 Chicago (芝加哥),更多可用地址可通过“https://api.vultr.com/v1/regions/list”查询;
- OSID=167 表示选择 CentOS 7 x86_64 系统,更多系统可通过“https://api.vultr.com/v1/os/list”查询;
- VPSPLANID=201 表示选择“25GB硬盘、1核CPU、1GB内存”的那个套餐(5美元一个月,不到一美分一个小时,用多久扣多久,用完销毁主机停止扣费),更多套餐可通过“https://api.vultr.com/v1/plans/list_vc2”查询。
执行后会返回一个 SUBID,用于唯一标识刚刚创建的主机。
销毁一台主机
curl -H 'API-Key: YOURKEY' https://api.vultr.com/v1/server/destroy --data 'SUBID=xxxxxx'
请自行将 xxxxxx 替换为已创建主机的 SUBID 值。
GET
示例:
import requests, json def list_vps(subid=None): url = "https://api.vultr.com/v1/server/list" headers = { "API-Key": "YOURKEY" } data = {} if subid: data["SUBID"] = subid resp = requests.get(url, headers=headers, data=data) if resp.status_code != requests.codes.ok: resp.raise_for_status() vps = resp.json() print_log("Found %d VPS" % len(vps)) print_log(resp.text) return vps
POST
示例:
import requests, json def create_vps(): url = "https://api.vultr.com/v1/server/create" headers = { "API-Key": "YOURKEY" } data = { "DCID": 2, "VPSPLANID": 201, "OSID": 167, "SCRIPTID": 711079 # 这个指定主机启动时自动执行的脚本,没有可以不指定 } print_log("Creating a new VPS: " + json.dumps(data, indent=4)) resp = requests.post(url, headers=headers, data=data) if resp.status_code != requests.codes.ok: print_log(json.dumps(resp.__dict__, indent=4)) resp.raise_for_status() print_log("Created VPS:\n" + json.dumps(resp.json(), indent=4)) return resp.json()["SUBID"]
其中用到的 SCRIPTID 前面没有将结果,Vultr 允许用户自己创建启动脚本(Startup script),这样主机第一次启动时会自动执行,下面给个示例:
def create_startup_script(): url = "https://api.vultr.com/v1/startupscript/create" headers = { "API-Key": "YOURKEY" } data = { "name": "my startup script", "script": r"""#!/bin/bash # do something here echo "Done!" """ } print_log("Creating a startup script:\n" + data["script"]) resp = requests.post(url, headers=headers, data=data) if resp.status_code != requests.codes.ok: print_log(json.dumps(resp.__dict__, indent=4)) resp.raise_for_status() scriptid = resp.json()["SCRIPTID"] print_log("Created SCRIPTID: %d" % scriptid) return scriptid
完。