lesscode-py 0.4.18__tar.gz → 0.4.20__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/PKG-INFO +1 -1
- lesscode-py-0.4.20/lesscode/utils/oss/__init__.py +160 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/oss/aliyun_oss.py +3 -1
- lesscode-py-0.4.20/lesscode/utils/oss/minio_oss.py +254 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/version.py +1 -1
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/base_handler.py +22 -8
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/web_server.py +2 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode_py.egg-info/PKG-INFO +1 -1
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode_py.egg-info/SOURCES.txt +1 -0
- lesscode-py-0.4.18/lesscode/web/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/README.md +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/base_connection_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/base_sql_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/clickhouse/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/clickhouse/clickhouse_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/clickhouse/clickhouse_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/condition_wrapper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/connection_info.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/db_function.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/dm/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/dm/dm_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/dm/dm_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/ds_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/elasticsearch/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/elasticsearch/elasticsearch_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/elasticsearch/elasticsearch_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/es/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/es/es_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/es/es_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/es/es_request.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/generic/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/generic/generic_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/generic/generic_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/init_connection_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mongodb/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mongodb/base_model.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mongodb/mongodb_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mongodb/mongodb_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mysql/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mysql/mysql_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mysql/mysql_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/nebula/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/nebula/nebula_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/nebula/nebula_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/neo4j/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/neo4j/neo4j_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/neo4j/neo4j_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/page.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/postgresql/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/postgresql/postgresql_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/postgresql/postgresql_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/redis/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/redis/redis_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/redis/redis_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/redis_cluster/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/redis_cluster/redis_cluster_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/redis_cluster/redis_cluster_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/relational_db_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/sqlalchemy/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/sqlalchemy/sqlalchemy_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/sqlalchemy/sqlalchemy_model_service.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/sqlalchemy/sqlalchemy_pool.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/extend_handlers/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/extend_handlers/doc/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/extend_handlers/doc/swagger_interface_doc_handler.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/extend_handlers/not_found_handler.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/mq/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/mq/kafka/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/mq/kafka/kafka_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/mq/rabbitmq/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/mq/rabbitmq/rabbitmq_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/sentry/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/sentry/sentry_monitor.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/task/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/task/job_info.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/task/task_helper.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/CacheUtil.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/cache_utils.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/custom_type.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/doc/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/doc/interface_doc.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/es_log/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/es_log/record_log.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/json.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/oss/ks3_oss.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/request.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/upms_util.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/wrapper.py +0 -0
- {lesscode-py-0.4.18/lesscode/utils/oss → lesscode-py-0.4.20/lesscode/web}/__init__.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/base_server_send_event_handler.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/base_websocket_handler.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/business_exception.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/native_handler.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/response_result.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/router_mapping.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/status_code.py +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode_py.egg-info/dependency_links.txt +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode_py.egg-info/top_level.txt +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/setup.cfg +0 -0
- {lesscode-py-0.4.18 → lesscode-py-0.4.20}/setup.py +0 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from io import BytesIO
|
|
3
|
+
|
|
4
|
+
from tornado.options import options
|
|
5
|
+
|
|
6
|
+
from lesscode.utils.oss.aliyun_oss import AliYunOss
|
|
7
|
+
from lesscode.utils.oss.ks3_oss import Ks3Oss
|
|
8
|
+
from lesscode.utils.oss.minio_oss import MinioOss
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class CommonOss:
|
|
12
|
+
def __init__(self, storage_type=None, data_type="stream", config_key="default", **kwargs):
|
|
13
|
+
"""
|
|
14
|
+
初始化OSS
|
|
15
|
+
Args:
|
|
16
|
+
storage_type (str): 存储类型,目前支持ks3和file
|
|
17
|
+
data_type (str): 数据类型,目前支持stream和file_path
|
|
18
|
+
storage_config (dict): 存储配置,目前支持ks3和file,file_name,aliyun,minio
|
|
19
|
+
"""
|
|
20
|
+
_storage_config = options.storage_config.get(config_key, {}) or dict()
|
|
21
|
+
self.storage_type = storage_type if storage_type else _storage_config.get("storage_type", "")
|
|
22
|
+
self.data_type = data_type
|
|
23
|
+
self.storage_config = kwargs.get("storage_config", {}) if kwargs.get("storage_config",
|
|
24
|
+
{}) else _storage_config.get(
|
|
25
|
+
"storage_config", {})
|
|
26
|
+
self.bucket_name = kwargs.get("bucket_name") or self.storage_config.pop("bucket_name", "")
|
|
27
|
+
|
|
28
|
+
def _save(self, key, io_stream: BytesIO = None, file_path: str = None, bucket_name: str = None):
|
|
29
|
+
file_url_obj = dict()
|
|
30
|
+
if self.storage_type == "ks3":
|
|
31
|
+
if self.data_type == "stream":
|
|
32
|
+
storage_config = self.storage_config or dict()
|
|
33
|
+
ks3 = Ks3Oss(bucket_name=self.bucket_name, **storage_config)
|
|
34
|
+
url = ks3.save(key=key, string_data=io_stream.getvalue(), content_type="string", policy="public-read",
|
|
35
|
+
bucket_name=bucket_name or self.bucket_name)
|
|
36
|
+
file_url_obj = {"key": key, "url": url}
|
|
37
|
+
elif self.data_type == "file_path":
|
|
38
|
+
storage_config = self.storage_config or dict()
|
|
39
|
+
ks3 = Ks3Oss(bucket_name=self.bucket_name, **storage_config)
|
|
40
|
+
url = ks3.save(key=key, filename=file_path, content_type="filename", policy="public-read")
|
|
41
|
+
file_url_obj = {"key": key, "url": url}
|
|
42
|
+
elif self.storage_type == "aliyun":
|
|
43
|
+
storage_config = self.storage_config or dict()
|
|
44
|
+
aliyun = AliYunOss(bucket_name=self.bucket_name, **storage_config)
|
|
45
|
+
url = aliyun.save(key=key, content_type="string", data=io_stream.getvalue(),
|
|
46
|
+
bucket_name=bucket_name or self.bucket_name)
|
|
47
|
+
file_url_obj = {"key": key, "url": url}
|
|
48
|
+
elif self.storage_type == "minio":
|
|
49
|
+
storage_config = self.storage_config or dict()
|
|
50
|
+
minio = MinioOss(**storage_config)
|
|
51
|
+
url = minio.save(key=key, content_type="string", data=io_stream.getvalue(),
|
|
52
|
+
bucket_name=bucket_name or self.bucket_name)
|
|
53
|
+
file_url_obj = {"key": key, "url": url}
|
|
54
|
+
elif self.storage_type == "file":
|
|
55
|
+
storage_path = ""
|
|
56
|
+
storage_dir = self.storage_config.get("storage_dir", "")
|
|
57
|
+
if not storage_dir:
|
|
58
|
+
raise Exception("storage_dir is empty")
|
|
59
|
+
if self.data_type == "stream":
|
|
60
|
+
if "\\" in key:
|
|
61
|
+
key_list = key.split("\\")
|
|
62
|
+
elif "/" in key:
|
|
63
|
+
key_list = key.split("/")
|
|
64
|
+
else:
|
|
65
|
+
key_list = [key]
|
|
66
|
+
storage_path = storage_dir
|
|
67
|
+
if key_list:
|
|
68
|
+
for k in key_list:
|
|
69
|
+
storage_path = os.path.join(storage_path, k)
|
|
70
|
+
dir_path = os.path.dirname(storage_path)
|
|
71
|
+
if not os.path.exists(dir_path):
|
|
72
|
+
os.makedirs(dir_path)
|
|
73
|
+
elif self.data_type == "file_path":
|
|
74
|
+
with open(file_path, 'rb') as infile:
|
|
75
|
+
io_stream = BytesIO(infile.read())
|
|
76
|
+
if storage_path:
|
|
77
|
+
with open(storage_path, 'wb') as outfile:
|
|
78
|
+
outfile.write(io_stream.getvalue())
|
|
79
|
+
file_url_obj = {"key": key, "url": storage_path}
|
|
80
|
+
return file_url_obj
|
|
81
|
+
|
|
82
|
+
def upload(self, **kwargs):
|
|
83
|
+
"""上传文件
|
|
84
|
+
Args:
|
|
85
|
+
files (list): 文件列表 可以是文件流列表,也可以是字典列表,字典格式为{"key":"文件key,可以是带路径的文件","stream":"文件流"}
|
|
86
|
+
Returns:
|
|
87
|
+
file_url_list: 文件url列表[{"key":"文件key,可以是带路径的文件","url":"本地文件存储的文件的全路径,对象存储,存放的是文件的下载地址"}]
|
|
88
|
+
"""
|
|
89
|
+
file_url_list = []
|
|
90
|
+
files = kwargs.get("files", [])
|
|
91
|
+
bucket_name = kwargs.get("bucket_name", self.bucket_name)
|
|
92
|
+
if not files:
|
|
93
|
+
raise Exception("files is empty")
|
|
94
|
+
if self.data_type == "stream":
|
|
95
|
+
for f in files:
|
|
96
|
+
if not isinstance(f, dict):
|
|
97
|
+
key = f.filename
|
|
98
|
+
stream = f.stream.read()
|
|
99
|
+
file_stream = BytesIO(stream)
|
|
100
|
+
else:
|
|
101
|
+
key = f.get("key", "")
|
|
102
|
+
_steam = f.get("stream")
|
|
103
|
+
stream = _steam.stream.read()
|
|
104
|
+
file_stream = BytesIO(stream)
|
|
105
|
+
file_url_obj = self._save(key=key, io_stream=file_stream, bucket_name=bucket_name)
|
|
106
|
+
file_url_list.append(file_url_obj)
|
|
107
|
+
|
|
108
|
+
elif self.data_type == "file_path":
|
|
109
|
+
for f in files:
|
|
110
|
+
if not isinstance(f, dict):
|
|
111
|
+
if "\\" in f:
|
|
112
|
+
file_name = f.split("\\")[-1]
|
|
113
|
+
elif "/" in f:
|
|
114
|
+
file_name = f.split("/")[-1]
|
|
115
|
+
else:
|
|
116
|
+
file_name = f
|
|
117
|
+
key = file_name
|
|
118
|
+
_file_path = f
|
|
119
|
+
else:
|
|
120
|
+
key = f.get("key", "")
|
|
121
|
+
_file_path = f.get("file_path")
|
|
122
|
+
file_url_obj = self._save(key=key, file_path=_file_path, bucket_name=bucket_name)
|
|
123
|
+
file_url_list.append(file_url_obj)
|
|
124
|
+
return file_url_list
|
|
125
|
+
|
|
126
|
+
def download(self, key, bucket_name=None):
|
|
127
|
+
"""下载文件,返回文件流
|
|
128
|
+
Args:
|
|
129
|
+
key (str): 上面接口返回的文件key
|
|
130
|
+
Returns:
|
|
131
|
+
file_stream: 文件流
|
|
132
|
+
:param bucket_name:
|
|
133
|
+
"""
|
|
134
|
+
if self.storage_type == "ks3":
|
|
135
|
+
storage_config = self.storage_config or dict()
|
|
136
|
+
ks3 = Ks3Oss(bucket_name=self.bucket_name, **storage_config)
|
|
137
|
+
return ks3.get_file(key=key, bucket_name=bucket_name or self.bucket_name)
|
|
138
|
+
elif self.storage_type == "aliyun":
|
|
139
|
+
storage_config = self.storage_config or dict()
|
|
140
|
+
aliyun = AliYunOss(bucket_name=self.bucket_name, **storage_config)
|
|
141
|
+
return aliyun.get_file(key=key, bucket_name=bucket_name or self.bucket_name)
|
|
142
|
+
elif self.storage_type == "minio":
|
|
143
|
+
storage_config = self.storage_config or dict()
|
|
144
|
+
minio = MinioOss(**storage_config)
|
|
145
|
+
return minio.get_file(bucket_name=bucket_name or self.bucket_name, key=key)
|
|
146
|
+
if self.storage_type == "file":
|
|
147
|
+
storage_dir = self.storage_config.get("storage_dir", "")
|
|
148
|
+
if "\\" in key:
|
|
149
|
+
key_list = key.split("\\")
|
|
150
|
+
elif "/" in key:
|
|
151
|
+
key_list = key.split("/")
|
|
152
|
+
else:
|
|
153
|
+
key_list = [key]
|
|
154
|
+
file_path = storage_dir
|
|
155
|
+
if key_list:
|
|
156
|
+
for k in key_list:
|
|
157
|
+
file_path = os.path.join(file_path, k)
|
|
158
|
+
with open(file_path, 'rb') as f:
|
|
159
|
+
return f.read()
|
|
160
|
+
return None
|
|
@@ -66,7 +66,8 @@ class AliYunOss:
|
|
|
66
66
|
self.instance = self.get_bucket_instance(bucket_name)
|
|
67
67
|
return self.instance.delete_bucket()
|
|
68
68
|
|
|
69
|
-
def save(self, key, content_type, data, bucket_name="",
|
|
69
|
+
def save(self, key, content_type, data, bucket_name="", region="oss-cn-hangzhou", domain="aliyuncs.com",
|
|
70
|
+
protocol="https", **kwargs):
|
|
70
71
|
if bucket_name:
|
|
71
72
|
self.instance = self.get_bucket_instance(bucket_name)
|
|
72
73
|
if content_type == "filename":
|
|
@@ -75,6 +76,7 @@ class AliYunOss:
|
|
|
75
76
|
self.instance.put_object(key=key, data=data, **kwargs)
|
|
76
77
|
else:
|
|
77
78
|
self.instance.put_object(key=key, data=data, **kwargs)
|
|
79
|
+
return f'{protocol}://{self.instance.name}.{region}.{domain}/{key}'
|
|
78
80
|
|
|
79
81
|
def get_url(self, key, bucket_name="", region="oss-cn-hangzhou", domain="aliyuncs.com", protocol="https"):
|
|
80
82
|
if bucket_name:
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
from datetime import timedelta
|
|
6
|
+
from io import BytesIO
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class MinioOss:
|
|
10
|
+
client = None
|
|
11
|
+
policy = '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":["*"]},"Action":["s3:GetBucketLocation","s3:ListBucket"],"Resource":["arn:aws:s3:::%s"]},{"Effect":"Allow","Principal":{"AWS":["*"]},"Action":["s3:GetObject"],"Resource":["arn:aws:s3:::%s/*"]}]}'
|
|
12
|
+
|
|
13
|
+
def __new__(cls, *args, **kwargs):
|
|
14
|
+
if not cls.client:
|
|
15
|
+
cls.client = object.__new__(cls)
|
|
16
|
+
return cls.client
|
|
17
|
+
|
|
18
|
+
def __init__(self, service, access_key, secret_key, secure=False):
|
|
19
|
+
try:
|
|
20
|
+
minio = importlib.import_module("minio")
|
|
21
|
+
except ImportError as e:
|
|
22
|
+
raise Exception(f"minio is not exist,run:pip install minio")
|
|
23
|
+
self.service = service
|
|
24
|
+
self.client = minio.Minio(service, access_key=access_key, secret_key=secret_key, secure=secure)
|
|
25
|
+
|
|
26
|
+
def exists_bucket(self, bucket_name):
|
|
27
|
+
"""
|
|
28
|
+
判断桶是否存在
|
|
29
|
+
:param bucket_name: 桶名称
|
|
30
|
+
:return:
|
|
31
|
+
"""
|
|
32
|
+
return self.client.bucket_exists(bucket_name=bucket_name)
|
|
33
|
+
|
|
34
|
+
def create_bucket(self, bucket_name: str, is_policy: bool = True):
|
|
35
|
+
"""
|
|
36
|
+
创建桶 + 赋予策略
|
|
37
|
+
:param bucket_name: 桶名
|
|
38
|
+
:param is_policy: 策略
|
|
39
|
+
:return:
|
|
40
|
+
"""
|
|
41
|
+
if self.exists_bucket(bucket_name=bucket_name):
|
|
42
|
+
return False
|
|
43
|
+
else:
|
|
44
|
+
self.client.make_bucket(bucket_name=bucket_name)
|
|
45
|
+
if is_policy:
|
|
46
|
+
policy = self.policy % (bucket_name, bucket_name)
|
|
47
|
+
self.client.set_bucket_policy(bucket_name=bucket_name, policy=policy)
|
|
48
|
+
return True
|
|
49
|
+
|
|
50
|
+
def get_bucket_list(self):
|
|
51
|
+
"""
|
|
52
|
+
列出存储桶
|
|
53
|
+
:return:
|
|
54
|
+
"""
|
|
55
|
+
buckets = self.client.list_buckets()
|
|
56
|
+
bucket_list = []
|
|
57
|
+
for bucket in buckets:
|
|
58
|
+
bucket_list.append(
|
|
59
|
+
{"bucket_name": bucket.name, "create_time": bucket.creation_date}
|
|
60
|
+
)
|
|
61
|
+
return bucket_list
|
|
62
|
+
|
|
63
|
+
def remove_bucket(self, bucket_name):
|
|
64
|
+
"""
|
|
65
|
+
删除桶
|
|
66
|
+
:param bucket_name:
|
|
67
|
+
:return:
|
|
68
|
+
"""
|
|
69
|
+
try:
|
|
70
|
+
minio_error = importlib.import_module("minio.error")
|
|
71
|
+
except ImportError as e:
|
|
72
|
+
raise Exception(f"minio is not exist,run:pip install minio")
|
|
73
|
+
try:
|
|
74
|
+
self.client.remove_bucket(bucket_name=bucket_name)
|
|
75
|
+
except minio_error.S3Error as e:
|
|
76
|
+
logging.error(f"[error]:{e}")
|
|
77
|
+
return False
|
|
78
|
+
return True
|
|
79
|
+
|
|
80
|
+
def bucket_list_files(self, bucket_name, prefix):
|
|
81
|
+
"""
|
|
82
|
+
列出存储桶中所有对象
|
|
83
|
+
:param bucket_name: 同名
|
|
84
|
+
:param prefix: 前缀
|
|
85
|
+
:return:
|
|
86
|
+
"""
|
|
87
|
+
try:
|
|
88
|
+
minio_error = importlib.import_module("minio.error")
|
|
89
|
+
except ImportError as e:
|
|
90
|
+
raise Exception(f"minio is not exist,run:pip install minio")
|
|
91
|
+
try:
|
|
92
|
+
files_list = self.client.list_objects(bucket_name=bucket_name, prefix=prefix, recursive=True)
|
|
93
|
+
return files_list
|
|
94
|
+
except minio_error.S3Error as e:
|
|
95
|
+
logging.error(f"[error]:{e}")
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
def bucket_policy(self, bucket_name):
|
|
99
|
+
"""
|
|
100
|
+
列出桶存储策略
|
|
101
|
+
:param bucket_name:
|
|
102
|
+
:return:
|
|
103
|
+
"""
|
|
104
|
+
try:
|
|
105
|
+
minio_error = importlib.import_module("minio.error")
|
|
106
|
+
except ImportError as e:
|
|
107
|
+
raise Exception(f"minio is not exist,run:pip install minio")
|
|
108
|
+
try:
|
|
109
|
+
policy = self.client.get_bucket_policy(bucket_name)
|
|
110
|
+
except minio_error.S3Error as e:
|
|
111
|
+
logging.error(f"[error]:{e}")
|
|
112
|
+
return None
|
|
113
|
+
return policy
|
|
114
|
+
|
|
115
|
+
def download_file(self, bucket_name, file, file_path, stream=1024 * 32):
|
|
116
|
+
"""
|
|
117
|
+
从bucket 下载文件 + 写入指定文件
|
|
118
|
+
:return:
|
|
119
|
+
"""
|
|
120
|
+
try:
|
|
121
|
+
minio_error = importlib.import_module("minio.error")
|
|
122
|
+
except ImportError as e:
|
|
123
|
+
raise Exception(f"minio is not exist,run:pip install minio")
|
|
124
|
+
try:
|
|
125
|
+
data = self.client.get_object(bucket_name, file)
|
|
126
|
+
with open(file_path, "wb") as fp:
|
|
127
|
+
for d in data.stream(stream):
|
|
128
|
+
fp.write(d)
|
|
129
|
+
except minio_error.S3Error as e:
|
|
130
|
+
logging.error(f"[error]:{e}")
|
|
131
|
+
|
|
132
|
+
def get_file(self, bucket_name, key):
|
|
133
|
+
data = self.client.get_object(bucket_name, object_name=key)
|
|
134
|
+
return data
|
|
135
|
+
|
|
136
|
+
def fget_file(self, bucket_name, file, file_path):
|
|
137
|
+
"""
|
|
138
|
+
下载保存文件保存本地
|
|
139
|
+
:param bucket_name:
|
|
140
|
+
:param file:
|
|
141
|
+
:param file_path:
|
|
142
|
+
:return:
|
|
143
|
+
"""
|
|
144
|
+
self.client.fget_object(bucket_name, file, file_path)
|
|
145
|
+
|
|
146
|
+
def copy_file(self, bucket_name, file, file_path):
|
|
147
|
+
"""
|
|
148
|
+
拷贝文件(最大支持5GB)
|
|
149
|
+
:param bucket_name:
|
|
150
|
+
:param file:
|
|
151
|
+
:param file_path:
|
|
152
|
+
:return:
|
|
153
|
+
"""
|
|
154
|
+
self.client.copy_object(bucket_name, file, file_path)
|
|
155
|
+
|
|
156
|
+
def upload_file(self, bucket_name, file, file_path, content_type):
|
|
157
|
+
"""
|
|
158
|
+
上传文件 + 写入
|
|
159
|
+
:param bucket_name: 桶名
|
|
160
|
+
:param file: 文件名
|
|
161
|
+
:param file_path: 本地文件路径
|
|
162
|
+
:param content_type: 文件类型
|
|
163
|
+
:return:
|
|
164
|
+
"""
|
|
165
|
+
try:
|
|
166
|
+
minio_error = importlib.import_module("minio.error")
|
|
167
|
+
except ImportError as e:
|
|
168
|
+
raise Exception(f"minio is not exist,run:pip install minio")
|
|
169
|
+
try:
|
|
170
|
+
with open(file_path, "rb") as file_data:
|
|
171
|
+
file_stat = os.stat(file_path)
|
|
172
|
+
self.client.put_object(bucket_name, file, file_data, file_stat.st_size, content_type=content_type)
|
|
173
|
+
except minio_error.S3Error as e:
|
|
174
|
+
logging.error(f"[error]:{e}")
|
|
175
|
+
|
|
176
|
+
def save(self, key, bucket_name, data, content_type="string", **kwargs):
|
|
177
|
+
ret = None
|
|
178
|
+
if content_type == "string":
|
|
179
|
+
ret = self.client.put_object(bucket_name=bucket_name, object_name=key, data=BytesIO(data), length=len(data),
|
|
180
|
+
**kwargs)
|
|
181
|
+
elif content_type == "filename":
|
|
182
|
+
with open(data, "rb") as f:
|
|
183
|
+
data = f.read()
|
|
184
|
+
ret = self.client.put_object(bucket_name=bucket_name, object_name=key, data=BytesIO(data), length=len(data),
|
|
185
|
+
**kwargs)
|
|
186
|
+
if ret:
|
|
187
|
+
if ret.status == 200:
|
|
188
|
+
return self.client.presigned_get_object(bucket_name=bucket_name, key=key, expires=3600)
|
|
189
|
+
else:
|
|
190
|
+
return False
|
|
191
|
+
else:
|
|
192
|
+
return False
|
|
193
|
+
|
|
194
|
+
def fput_file(self, bucket_name, file, file_path):
|
|
195
|
+
"""
|
|
196
|
+
上传文件
|
|
197
|
+
:param bucket_name: 桶名
|
|
198
|
+
:param file: 文件名
|
|
199
|
+
:param file_path: 本地文件路径
|
|
200
|
+
:return:
|
|
201
|
+
"""
|
|
202
|
+
try:
|
|
203
|
+
minio_error = importlib.import_module("minio.error")
|
|
204
|
+
except ImportError as e:
|
|
205
|
+
raise Exception(f"minio is not exist,run:pip install minio")
|
|
206
|
+
try:
|
|
207
|
+
self.client.fput_object(bucket_name, file, file_path)
|
|
208
|
+
except minio_error.S3Error as e:
|
|
209
|
+
logging.error(f"[error]:{e}")
|
|
210
|
+
|
|
211
|
+
def stat_object(self, bucket_name, file):
|
|
212
|
+
"""
|
|
213
|
+
获取文件元数据
|
|
214
|
+
:param bucket_name:
|
|
215
|
+
:param file:
|
|
216
|
+
:return:
|
|
217
|
+
"""
|
|
218
|
+
try:
|
|
219
|
+
minio_error = importlib.import_module("minio.error")
|
|
220
|
+
except ImportError as e:
|
|
221
|
+
raise Exception(f"minio is not exist,run:pip install minio")
|
|
222
|
+
try:
|
|
223
|
+
data = self.client.stat_object(bucket_name, file)
|
|
224
|
+
return data
|
|
225
|
+
except minio_error.S3Error as e:
|
|
226
|
+
logging.error(f"[error]:{e}")
|
|
227
|
+
return None
|
|
228
|
+
|
|
229
|
+
def remove_file(self, bucket_name, file):
|
|
230
|
+
"""
|
|
231
|
+
移除单个文件
|
|
232
|
+
:return:
|
|
233
|
+
"""
|
|
234
|
+
self.client.remove_object(bucket_name, file)
|
|
235
|
+
|
|
236
|
+
def remove_files(self, bucket_name, file_list):
|
|
237
|
+
"""
|
|
238
|
+
删除多个文件
|
|
239
|
+
:return:
|
|
240
|
+
"""
|
|
241
|
+
try:
|
|
242
|
+
deleteobjects = importlib.import_module("minio.deleteobjects")
|
|
243
|
+
except ImportError as e:
|
|
244
|
+
raise Exception(f"minio is not exist,run:pip install minio")
|
|
245
|
+
delete_object_list = [deleteobjects.DeleteObject(file) for file in file_list]
|
|
246
|
+
for del_err in self.client.remove_objects(bucket_name, delete_object_list):
|
|
247
|
+
logging.error(del_err)
|
|
248
|
+
|
|
249
|
+
def presigned_get_file(self, bucket_name, file, days=7):
|
|
250
|
+
"""
|
|
251
|
+
生成一个http GET操作 签证URL
|
|
252
|
+
:return:
|
|
253
|
+
"""
|
|
254
|
+
return self.client.presigned_get_object(bucket_name, file, expires=timedelta(days=days))
|
|
@@ -271,20 +271,34 @@ class BaseHandler(RequestHandler):
|
|
|
271
271
|
for k, v in params_dict.items():
|
|
272
272
|
if "self" != k:
|
|
273
273
|
_params[k] = v
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
274
|
+
if options.operate_log_write_method == "api":
|
|
275
|
+
t = Thread(target=sync_common_request_origin, kwargs={
|
|
276
|
+
"url": options.write_operate_log_url,
|
|
277
|
+
"method": "POST",
|
|
278
|
+
"json": {
|
|
279
|
+
"operate_action": title,
|
|
280
|
+
"operate_url": self.request.path,
|
|
281
|
+
"operate_user_id": _user_id,
|
|
282
|
+
"operate_user_username": _username,
|
|
283
|
+
"params": _params,
|
|
284
|
+
"operate_user_phone_no": _phone_no
|
|
285
|
+
}
|
|
286
|
+
})
|
|
287
|
+
t.start()
|
|
288
|
+
logging.info(f"添加操作日志,url:{self.request.path},title={title}")
|
|
289
|
+
elif options.operate_log_write_method == "function":
|
|
290
|
+
t = Thread(target=options.operate_log_write_func, kwargs={
|
|
291
|
+
"operate_id": uuid.uuid1().hex,
|
|
278
292
|
"operate_action": title,
|
|
279
293
|
"operate_url": self.request.path,
|
|
280
294
|
"operate_user_id": _user_id,
|
|
281
295
|
"operate_user_username": _username,
|
|
282
296
|
"params": _params,
|
|
283
297
|
"operate_user_phone_no": _phone_no
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
298
|
+
})
|
|
299
|
+
t.start()
|
|
300
|
+
logging.info(f"添加操作日志,url:{self.request.path},title={title}")
|
|
301
|
+
|
|
288
302
|
except Exception as e:
|
|
289
303
|
logging.error(f"添加操作日志失败,url={self.request.path},错误信息:{e}")
|
|
290
304
|
# 判断是否为异步非阻塞方法,true 则直接调用
|
|
@@ -41,6 +41,8 @@ define("eureka_config", default={}, type=dict, help="eureka配置")
|
|
|
41
41
|
define("rms_register_enable", default=False, type=bool, help="是否启动资源注册")
|
|
42
42
|
define("rms_register_server", default="http://127.0.0.1:8918", type=str, help="启动资源注册")
|
|
43
43
|
define("operate_log_enable", default=False, type=bool, help="记录操作日志开关,默认关闭")
|
|
44
|
+
define("operate_log_write_method", default="api", type=str, help="记录操作日志方式,默认是api")
|
|
45
|
+
define("operate_log_write_func", default=None, type=FunctionType, help="记录操作的函数")
|
|
44
46
|
define("write_operate_log_url", default="http://127.0.0.1:8918", type=str, help="记录操作日志接口")
|
|
45
47
|
define("running_env", default="local", type=str, help="运行环境")
|
|
46
48
|
define("request_type", default="request", type=str, help="请求类型")
|
|
@@ -83,6 +83,7 @@ lesscode/utils/es_log/record_log.py
|
|
|
83
83
|
lesscode/utils/oss/__init__.py
|
|
84
84
|
lesscode/utils/oss/aliyun_oss.py
|
|
85
85
|
lesscode/utils/oss/ks3_oss.py
|
|
86
|
+
lesscode/utils/oss/minio_oss.py
|
|
86
87
|
lesscode/web/__init__.py
|
|
87
88
|
lesscode/web/base_handler.py
|
|
88
89
|
lesscode/web/base_server_send_event_handler.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/sqlalchemy/sqlalchemy_model_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|