/
qn.py
103 lines (87 loc) · 3.65 KB
/
qn.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
"""171203 Adel Liu
即将使用web前端直接上传到七牛 而无需通过服务器 减小服务器压力
"""
import qiniu
import requests
from qiniu import urlsafe_base64_encode
from common import deprint
ACCESS_KEY = Config.get_value_by_key('qiniu-access-key', 'YOUR-ACCESS-KEY').body
SECRET_KEY = Config.get_value_by_key('qiniu-secret-key', 'YOUR-SECRET-KEY').body
RES_BUCKET = Config.get_value_by_key('qiniu-res-bucket', 'YOUR-RES-BUCKET').body
PUBLIC_BUCKET = Config.get_value_by_key('qiniu-public-bucket', 'YOUR-PUBLIC-BUCKET').body
_AUTH = qiniu.Auth(access_key=ACCESS_KEY, secret_key=SECRET_KEY)
_HOST = HOST
_KEY_PREFIX = 'disk/'
QINIU_MANAGE_HOST = "https://rs.qiniu.com"
RES_CDN_HOST = 'https://res.6-79.cn'
PUBLIC_CDN_HOST = 'https://image.6-79.cn'
class QN:
def __init__(self, auth, bucket, cdn_host, public):
self.auth = auth
self.bucket = bucket
self.cdn_host = cdn_host
self.public = public
def get_upload_token(self, key, policy):
"""
获取七牛上传token
:param policy: 上传策略
:param key: 规定的键
"""
key = _KEY_PREFIX + key
return self.auth.upload_token(bucket=self.bucket, key=key, expires=3600, policy=policy), key
def qiniu_auth_callback(self, request):
"""七牛callback认证校验"""
if not isinstance(request, HttpRequest):
return Ret(Error.STRANGE)
auth_header = request.META.get('HTTP_AUTHORIZATION')
if auth_header is None:
return Ret(Error.UNAUTH_CALLBACK)
url = request.get_full_path()
body = request.body
verified = self.auth.verify_callback(auth_header, url, body, content_type='application/json')
if not verified:
return Ret(Error.UNAUTH_CALLBACK)
return Ret()
def get_resource_url(self, key, expires=3600):
"""获取资源链接"""
url = '%s/%s' % (self.cdn_host, key)
if self.public:
return '%s/%s' % (self.cdn_host, key)
else:
return self.auth.private_download_url(url, expires=expires)
@staticmethod
def deal_manage_res(target, access_token):
url = '%s%s' % (QINIU_MANAGE_HOST, target)
headers = {
'Content-Type': 'application/json',
'Authorization': 'QBox %s' % access_token,
}
try:
r = requests.post(url, headers=headers)
except requests.exceptions.RequestException:
return Ret(Error.ERROR_REQUEST_QINIU)
status = r.status_code
r.close()
if status == 200:
return Ret()
elif status == 401:
return Ret(Error.QINIU_UNAUTHORIZED)
else:
deprint(status)
return Ret(Error.FAIL_QINIU)
def delete_res(self, key):
entry = '%s:%s' % (self.bucket, key)
encoded_entry = urlsafe_base64_encode(entry)
target = '/delete/%s' % encoded_entry
access_token = self.auth.token_of_request(target, content_type='application/json')
return self.deal_manage_res(target, access_token)
def move_res(self, key, new_key):
entry = '%s:%s' % (self.bucket, key)
encoded_entry = urlsafe_base64_encode(entry)
new_entry = '%s:%s' % (self.bucket, new_key)
encoded_new_entry = urlsafe_base64_encode(new_entry)
target = '/move/%s/%s' % (encoded_entry, encoded_new_entry)
access_token = self.auth.token_of_request(target, content_type='application/json')
return self.deal_manage_res(target, access_token)
QN_RES_MANAGER = QN(_AUTH, RES_BUCKET, RES_CDN_HOST, public=False)
QN_PUBLIC_MANAGER = QN(_AUTH, PUBLIC_BUCKET, PUBLIC_CDN_HOST, public=True)