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.
Files changed (103) hide show
  1. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/PKG-INFO +1 -1
  2. lesscode-py-0.4.20/lesscode/utils/oss/__init__.py +160 -0
  3. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/oss/aliyun_oss.py +3 -1
  4. lesscode-py-0.4.20/lesscode/utils/oss/minio_oss.py +254 -0
  5. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/version.py +1 -1
  6. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/base_handler.py +22 -8
  7. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/web_server.py +2 -0
  8. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode_py.egg-info/PKG-INFO +1 -1
  9. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode_py.egg-info/SOURCES.txt +1 -0
  10. lesscode-py-0.4.18/lesscode/web/__init__.py +0 -0
  11. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/README.md +0 -0
  12. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/__init__.py +0 -0
  13. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/__init__.py +0 -0
  14. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/base_connection_pool.py +0 -0
  15. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/base_sql_helper.py +0 -0
  16. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/clickhouse/__init__.py +0 -0
  17. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/clickhouse/clickhouse_helper.py +0 -0
  18. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/clickhouse/clickhouse_pool.py +0 -0
  19. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/condition_wrapper.py +0 -0
  20. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/connection_info.py +0 -0
  21. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/db_function.py +0 -0
  22. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/dm/__init__.py +0 -0
  23. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/dm/dm_helper.py +0 -0
  24. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/dm/dm_pool.py +0 -0
  25. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/ds_helper.py +0 -0
  26. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/elasticsearch/__init__.py +0 -0
  27. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/elasticsearch/elasticsearch_helper.py +0 -0
  28. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/elasticsearch/elasticsearch_pool.py +0 -0
  29. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/es/__init__.py +0 -0
  30. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/es/es_helper.py +0 -0
  31. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/es/es_pool.py +0 -0
  32. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/es/es_request.py +0 -0
  33. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/generic/__init__.py +0 -0
  34. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/generic/generic_helper.py +0 -0
  35. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/generic/generic_pool.py +0 -0
  36. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/init_connection_pool.py +0 -0
  37. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mongodb/__init__.py +0 -0
  38. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mongodb/base_model.py +0 -0
  39. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mongodb/mongodb_helper.py +0 -0
  40. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mongodb/mongodb_pool.py +0 -0
  41. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mysql/__init__.py +0 -0
  42. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mysql/mysql_helper.py +0 -0
  43. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/mysql/mysql_pool.py +0 -0
  44. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/nebula/__init__.py +0 -0
  45. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/nebula/nebula_helper.py +0 -0
  46. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/nebula/nebula_pool.py +0 -0
  47. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/neo4j/__init__.py +0 -0
  48. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/neo4j/neo4j_helper.py +0 -0
  49. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/neo4j/neo4j_pool.py +0 -0
  50. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/page.py +0 -0
  51. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/postgresql/__init__.py +0 -0
  52. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/postgresql/postgresql_helper.py +0 -0
  53. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/postgresql/postgresql_pool.py +0 -0
  54. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/redis/__init__.py +0 -0
  55. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/redis/redis_helper.py +0 -0
  56. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/redis/redis_pool.py +0 -0
  57. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/redis_cluster/__init__.py +0 -0
  58. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/redis_cluster/redis_cluster_helper.py +0 -0
  59. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/redis_cluster/redis_cluster_pool.py +0 -0
  60. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/relational_db_helper.py +0 -0
  61. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/sqlalchemy/__init__.py +0 -0
  62. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/sqlalchemy/sqlalchemy_helper.py +0 -0
  63. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/sqlalchemy/sqlalchemy_model_service.py +0 -0
  64. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/db/sqlalchemy/sqlalchemy_pool.py +0 -0
  65. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/extend_handlers/__init__.py +0 -0
  66. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/extend_handlers/doc/__init__.py +0 -0
  67. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/extend_handlers/doc/swagger_interface_doc_handler.py +0 -0
  68. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/extend_handlers/not_found_handler.py +0 -0
  69. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/mq/__init__.py +0 -0
  70. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/mq/kafka/__init__.py +0 -0
  71. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/mq/kafka/kafka_helper.py +0 -0
  72. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/mq/rabbitmq/__init__.py +0 -0
  73. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/mq/rabbitmq/rabbitmq_helper.py +0 -0
  74. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/sentry/__init__.py +0 -0
  75. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/sentry/sentry_monitor.py +0 -0
  76. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/task/__init__.py +0 -0
  77. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/task/job_info.py +0 -0
  78. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/task/task_helper.py +0 -0
  79. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/CacheUtil.py +0 -0
  80. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/__init__.py +0 -0
  81. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/cache_utils.py +0 -0
  82. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/custom_type.py +0 -0
  83. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/doc/__init__.py +0 -0
  84. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/doc/interface_doc.py +0 -0
  85. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/es_log/__init__.py +0 -0
  86. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/es_log/record_log.py +0 -0
  87. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/json.py +0 -0
  88. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/oss/ks3_oss.py +0 -0
  89. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/request.py +0 -0
  90. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/upms_util.py +0 -0
  91. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/utils/wrapper.py +0 -0
  92. {lesscode-py-0.4.18/lesscode/utils/oss → lesscode-py-0.4.20/lesscode/web}/__init__.py +0 -0
  93. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/base_server_send_event_handler.py +0 -0
  94. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/base_websocket_handler.py +0 -0
  95. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/business_exception.py +0 -0
  96. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/native_handler.py +0 -0
  97. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/response_result.py +0 -0
  98. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/router_mapping.py +0 -0
  99. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode/web/status_code.py +0 -0
  100. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode_py.egg-info/dependency_links.txt +0 -0
  101. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/lesscode_py.egg-info/top_level.txt +0 -0
  102. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/setup.cfg +0 -0
  103. {lesscode-py-0.4.18 → lesscode-py-0.4.20}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-py
3
- Version: 0.4.18
3
+ Version: 0.4.20
4
4
  Summary: lesscode-python 是基于tornado的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://gitee.com/yongchao9/lesscode-python
6
6
  Author: Chao.yy
@@ -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="", **kwargs):
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))
@@ -5,4 +5,4 @@
5
5
  lesscode python version file.
6
6
  """
7
7
 
8
- __version__ = "0.4.18"
8
+ __version__ = "0.4.20"
@@ -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
- t = Thread(target=sync_common_request_origin, kwargs={
275
- "url": options.write_operate_log_url,
276
- "method": "POST",
277
- "json": {
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
- t.start()
287
- logging.info(f"添加操作日志,url:{self.request.path},title={title}")
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="请求类型")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-py
3
- Version: 0.4.18
3
+ Version: 0.4.20
4
4
  Summary: lesscode-python 是基于tornado的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://gitee.com/yongchao9/lesscode-python
6
6
  Author: Chao.yy
@@ -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