Skip to content

Commit 8d1aded

Browse files
authored
Merge pull request #379 from qiniu/develop
修复扩展状态码异常处理问题、添加了查询短信发送记录、空间和域名操作 相关方法
2 parents b3aabfa + 1d61113 commit 8d1aded

13 files changed

+255
-27
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ $ py.test
6060
## 常见问题
6161

6262
- 第二个参数info保留了请求响应的信息,失败情况下ret 为none, 将info可以打印出来,提交给我们。
63-
- API 的使用 demo 可以参考 [单元测试](https://github.com/qiniu/python-sdk/blob/master/test_qiniu.py)
63+
- API 的使用 demo 可以参考 [examples示例](https://github.com/qiniu/python-sdk/tree/master/examples)
6464
- 如果碰到`ImportError: No module named requests.auth` 请安装 `requests`
6565

6666
## 代码贡献
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"http:wxCLv4yl_5saIuOHbbZbkP-Ef3kFFFeCDYmwTdg3:upload30": {"upHosts": ["http://up.qiniu.com", "http://upload.qiniu.com", "-H up.qiniu.com http://183.131.7.3"], "ioHosts": ["http://iovip.qbox.me"], "deadline": 1598428478}}

examples/batch_restoreAr.py

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# -*- coding: utf-8 -*-
2+
# flake8: noqa
3+
4+
"""
5+
批量解冻文件
6+
https://developer.qiniu.com/kodo/api/1250/batch
7+
"""
8+
9+
from qiniu import build_batch_restoreAr, Auth, BucketManager
10+
11+
# 七牛账号的公钥和私钥
12+
access_key = '<access_key>'
13+
secret_key = '<secret_key>'
14+
15+
q = Auth(access_key, secret_key)
16+
17+
bucket = BucketManager(q)
18+
19+
# 存储空间
20+
bucket_name = "空间名"
21+
22+
# 字典的键为需要解冻的文件,值为解冻有效期1-7
23+
ops = build_batch_restoreAr(bucket_name,
24+
{"test00.png": 1,
25+
"test01.jpeg": 2,
26+
"test02.mp4": 3
27+
}
28+
)
29+
30+
ret, info = bucket.batch(ops)
31+
print(info)

examples/bucket_domain.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# -*- coding: utf-8 -*-
2+
# flake8: noqa
3+
4+
from qiniu import Auth
5+
from qiniu import BucketManager
6+
7+
"""
8+
获取空间绑定的加速域名
9+
https://developer.qiniu.com/kodo/api/3949/get-the-bucket-space-domain
10+
"""
11+
12+
# 七牛账号的 公钥和私钥
13+
access_key = '<access_key>'
14+
secret_key = '<secret_key>'
15+
16+
# 空间名
17+
bucket_name = ''
18+
19+
q = Auth(access_key, secret_key)
20+
21+
bucket = BucketManager(q)
22+
23+
ret, info = bucket.bucket_domain(bucket_name)
24+
print(info)

examples/change_bucket_permission.py

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# -*- coding: utf-8 -*-
2+
# flake8: noqa
3+
4+
from qiniu import Auth
5+
from qiniu import BucketManager
6+
7+
# 需要填写七牛账号的 公钥和私钥
8+
access_key = '<access_key>'
9+
secret_key = '<secret_key>'
10+
11+
# 空间名
12+
bucket_name = ""
13+
14+
# private 参数必须是str类型,0表示公有空间,1表示私有空间
15+
private = "0"
16+
17+
q = Auth(access_key, secret_key)
18+
19+
bucket = BucketManager(q)
20+
21+
ret, info = bucket.change_bucket_permission(bucket_name, private)
22+
print(info)

examples/domain_relevant.py

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# -*- coding: utf-8 -*-
2+
from qiniu import QiniuMacAuth, DomainManager
3+
import json
4+
5+
"""域名上线"""
6+
7+
# 七牛账号的 公钥和私钥
8+
access_key = "<access_key>"
9+
secret_key = "<secret_key>"
10+
11+
auth = QiniuMacAuth(access_key, secret_key)
12+
13+
manager = DomainManager(auth)
14+
15+
# 域名
16+
name = "zhuchangzhao2.peterpy.cn"
17+
18+
ret, res = manager.domain_online(name)
19+
20+
headers = {"code": res.status_code, "reqid": res.req_id, "xlog": res.x_log}
21+
print(json.dumps(headers, indent=4, ensure_ascii=False))
22+
print(json.dumps(ret, indent=4, ensure_ascii=False))
23+
24+
"""域名下线"""
25+
26+
# 七牛账号的 公钥和私钥
27+
access_key = "<access_key>"
28+
secret_key = "<secret_key>"
29+
30+
auth = QiniuMacAuth(access_key, secret_key)
31+
32+
manager = DomainManager(auth)
33+
34+
# 域名
35+
name = ""
36+
37+
ret, res = manager.domain_offline(name)
38+
39+
headers = {"code": res.status_code, "reqid": res.req_id, "xlog": res.x_log}
40+
print(json.dumps(headers, indent=4, ensure_ascii=False))
41+
print(json.dumps(ret, indent=4, ensure_ascii=False))
42+
43+
"""删除域名"""
44+
45+
# 七牛账号的 公钥和私钥
46+
access_key = "<access_key>"
47+
secret_key = "<secret_key>"
48+
49+
auth = QiniuMacAuth(access_key, secret_key)
50+
51+
manager = DomainManager(auth)
52+
53+
# 域名
54+
name = ""
55+
56+
ret, res = manager.delete_domain(name)
57+
58+
headers = {"code": res.status_code, "reqid": res.req_id, "xlog": res.x_log}
59+
print(json.dumps(headers, indent=4, ensure_ascii=False))
60+
print(json.dumps(ret, indent=4, ensure_ascii=False))

examples/sms_test.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,17 @@
8484
print(req, info)
8585
"""
8686

87+
"""
88+
# 查询短信发送记录
89+
req, info = sms.get_messages_info()
90+
print(req, info)
91+
"""
92+
8793
"""
8894
#发送短信
8995
"""
90-
template_id = ''
96+
template_id = ''
9197
mobiles = []
9298
parameters = {}
9399
req, info = sms.sendMessage(template_id, mobiles, parameters)
94100
print(req, info)
95-
96-
97-
98-

qiniu/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from .region import Region
1919

2020
from .services.storage.bucket import BucketManager, build_batch_copy, build_batch_rename, build_batch_move, \
21-
build_batch_stat, build_batch_delete
21+
build_batch_stat, build_batch_delete, build_batch_restoreAr
2222
from .services.storage.uploader import put_data, put_file, put_stream
2323
from .services.cdn.manager import CdnManager, create_timestamp_anti_leech_url, DomainManager
2424
from .services.processing.pfop import PersistentFop

qiniu/http.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def _post_with_auth(url, data, auth):
113113

114114

115115
def _get_with_auth(url, data, auth):
116-
return _get(url, data, qiniu.auth.RequestsAuth(auth))
116+
return _get(url, data, qiniu.auth.RequestsAuth(auth))
117117

118118

119119
def _post_with_auth_and_headers(url, data, auth, headers):
@@ -245,14 +245,14 @@ def __init__(self, response, exception=None):
245245
self.req_id = response.headers.get('X-Reqid')
246246
self.x_log = response.headers.get('X-Log')
247247
if self.status_code >= 400:
248-
if 600 > self.status_code >= 499:
249-
self.error = response.text
250-
else:
248+
if self.__check_json(response):
251249
ret = response.json() if response.text != '' else None
252-
if ret is None or ret['error'] is None:
250+
if ret is None:
253251
self.error = 'unknown'
254252
else:
255-
self.error = ret['error']
253+
self.error = response.text
254+
else:
255+
self.error = response.text
256256
if self.req_id is None and self.status_code == 200:
257257
self.error = 'server is not qiniu'
258258

@@ -280,3 +280,10 @@ def __str__(self):
280280

281281
def __repr__(self):
282282
return self.__str__()
283+
284+
def __check_json(self, reponse):
285+
try:
286+
reponse.json()
287+
return True
288+
except Exception:
289+
return False

qiniu/services/cdn/manager.py

+40
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,46 @@ def create_domain(self, name, body):
200200
url = '{0}/domain/{1}'.format(self.server, name)
201201
return self.__post(url, body)
202202

203+
def domain_online(self, name):
204+
"""
205+
上线域名,文档 https://developer.qiniu.com/fusion/api/4246/the-domain-name#6
206+
207+
Args:
208+
name: 域名, 如果是泛域名,必须以点号 . 开头
209+
bosy: 创建域名参数
210+
Returns:
211+
{}
212+
"""
213+
url = '{0}/domain/{1}/online'.format(self.server, name)
214+
return http._post_with_qiniu_mac(url, None, self.auth)
215+
216+
def domain_offline(self, name):
217+
"""
218+
下线域名,文档 https://developer.qiniu.com/fusion/api/4246/the-domain-name#5
219+
220+
Args:
221+
name: 域名, 如果是泛域名,必须以点号 . 开头
222+
bosy: 创建域名参数
223+
Returns:
224+
{}
225+
"""
226+
url = '{0}/domain/{1}/offline'.format(self.server, name)
227+
return http._post_with_qiniu_mac(url, None, self.auth)
228+
229+
def delete_domain(self, name):
230+
"""
231+
删除域名,文档 https://developer.qiniu.com/fusion/api/4246/the-domain-name#8
232+
233+
Args:
234+
name: 域名, 如果是泛域名,必须以点号 . 开头
235+
Returns:
236+
返回一个tuple对象,其格式为(<result>, <ResponseInfo>)
237+
- result 成功返回dict{},失败返回{"error": "<errMsg string>"}
238+
- ResponseInfo 请求的Response信息
239+
"""
240+
url = '{0}/domain/{1}'.format(self.server, name)
241+
return self.__get(url)
242+
203243
def get_domain(self, name):
204244
"""
205245
获取域名信息,文档 https://developer.qiniu.com/fusion/api/4246/the-domain-name

qiniu/services/sms/sms.py

+21-12
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ def querySignature(self, audit_status=None, page=1, page_size=20):
5656
"page_size": int,
5757
}
5858
"""
59-
url = '{}/v1/signature'.format(self.server)
59+
url = '{0}/v1/signature'.format(self.server)
6060
if audit_status:
61-
url = '{}?audit_status={}&page={}&page_size={}'.format(url, audit_status, page, page_size)
61+
url = '{0}?audit_status={1}&page={2}&page_size={3}'.format(url, audit_status, page, page_size)
6262
else:
63-
url = '{}?page={}&page_size={}'.format(url, page, page_size)
63+
url = '{0}?page={1}&page_size={2}'.format(url, page, page_size)
6464
return self.__get(url)
6565

6666
def updateSignature(self, id, signature):
@@ -73,7 +73,7 @@ def updateSignature(self, id, signature):
7373
}
7474
:return:
7575
"""
76-
url = '{}/v1/signature/{}'.format(self.server, id)
76+
url = '{0}/v1/signature/{1}'.format(self.server, id)
7777
req = {}
7878
req['signature'] = signature
7979
body = json.dumps(req)
@@ -87,7 +87,7 @@ def deleteSignature(self, id):
8787
* @retrun : 请求成功 HTTP 状态码为 200
8888
8989
"""
90-
url = '{}/v1/signature/{}'.format(self.server, id)
90+
url = '{0}/v1/signature/{1}'.format(self.server, id)
9191
return self.__delete(url)
9292

9393
def createTemplate(self, name, template, type, description, signature_id):
@@ -103,7 +103,7 @@ def createTemplate(self, name, template, type, description, signature_id):
103103
"template_id": string
104104
}
105105
"""
106-
url = '{}/v1/template'.format(self.server)
106+
url = '{0}/v1/template'.format(self.server)
107107
req = {}
108108
req['name'] = name
109109
req['template'] = template
@@ -137,11 +137,11 @@ def queryTemplate(self, audit_status, page=1, page_size=20):
137137
"page_size": int
138138
}
139139
"""
140-
url = '{}/v1/template'.format(self.server)
140+
url = '{0}/v1/template'.format(self.server)
141141
if audit_status:
142-
url = '{}?audit_status={}&page={}&page_size={}'.format(url, audit_status, page, page_size)
142+
url = '{0}?audit_status={1}&page={2}&page_size={3}'.format(url, audit_status, page, page_size)
143143
else:
144-
url = '{}?page={}&page_size={}'.format(url, page, page_size)
144+
url = '{0}?page={1}&page_size={2}'.format(url, page, page_size)
145145
return self.__get(url)
146146

147147
def updateTemplate(self, id, name, template, description, signature_id):
@@ -154,7 +154,7 @@ def updateTemplate(self, id, name, template, description, signature_id):
154154
:param signature_id: 已经审核通过的签名 string 类型,必填
155155
:return: 请求成功 HTTP 状态码为 200
156156
"""
157-
url = '{}/v1/template/{}'.format(self.server, id)
157+
url = '{0}/v1/template/{1}'.format(self.server, id)
158158
req = {}
159159
req['name'] = name
160160
req['template'] = template
@@ -169,7 +169,7 @@ def deleteTemplate(self, id):
169169
:param id: template_id
170170
:return: 请求成功 HTTP 状态码为 200
171171
"""
172-
url = '{}/v1/template/{}'.format(self.server, id)
172+
url = '{0}/v1/template/{1}'.format(self.server, id)
173173
return self.__delete(url)
174174

175175
def sendMessage(self, template_id, mobiles, parameters):
@@ -182,14 +182,23 @@ def sendMessage(self, template_id, mobiles, parameters):
182182
"job_id": string
183183
}
184184
"""
185-
url = '{}/v1/message'.format(self.server)
185+
url = '{0}/v1/message'.format(self.server)
186186
req = {}
187187
req['template_id'] = template_id
188188
req['mobiles'] = mobiles
189189
req['parameters'] = parameters
190190
body = json.dumps(req)
191191
return self.__post(url, body)
192192

193+
def get_messages_info(self):
194+
"""
195+
查询发送记录,文档:https://developer.qiniu.com/sms/api/5852/query-send-sms
196+
:return:
197+
{}
198+
"""
199+
url = "{0}/v1/messages".format(self.server)
200+
return self.__get(url)
201+
193202
def __post(self, url, data=None):
194203
headers = {'Content-Type': 'application/json'}
195204
return http._post_with_qiniu_mac_and_headers(url, data, self.auth, headers)

0 commit comments

Comments
 (0)