lesscode-flask 0.0.97__tar.gz → 0.0.99__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 (52) hide show
  1. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/PKG-INFO +1 -1
  2. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/__init__.py +1 -1
  3. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/log/access_log_handler.py +1 -3
  4. lesscode_flask-0.0.99/lesscode_flask/static/swagger.py +67 -0
  5. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/swagger/swagger_template.py +10 -2
  6. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/swagger/swagger_util.py +16 -2
  7. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask.egg-info/PKG-INFO +1 -1
  8. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask.egg-info/SOURCES.txt +1 -0
  9. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/query_runner/elasticsearch.py +21 -66
  10. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/README.md +0 -0
  11. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/app.py +0 -0
  12. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/db/__init__.py +0 -0
  13. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/db/datasource.py +0 -0
  14. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/db/executor.py +0 -0
  15. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/export_data/__init__.py +0 -0
  16. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/export_data/data_download_handler.py +0 -0
  17. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/model/access_log.py +0 -0
  18. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/model/base_model.py +0 -0
  19. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/model/parameterized_query.py +0 -0
  20. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/model/response_result.py +0 -0
  21. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/model/user.py +0 -0
  22. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/service/access_log_service.py +0 -0
  23. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/service/base_service.py +0 -0
  24. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/setting/__init__.py +0 -0
  25. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/setup/__init__.py +0 -0
  26. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/__init__.py +0 -0
  27. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/decorator/__init__.py +0 -0
  28. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/decorator/cache.py +0 -0
  29. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/decorator/swagger.py +0 -0
  30. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/file/file_exporter.py +0 -0
  31. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/helpers.py +0 -0
  32. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/json/NotSortJSONProvider.py +0 -0
  33. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/oss/__init__.py +0 -0
  34. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/oss/ks3_oss.py +0 -0
  35. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/redis/redis_helper.py +0 -0
  36. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/request/request.py +0 -0
  37. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/thread/thread_utils.py +0 -0
  38. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/wsgi.py +0 -0
  39. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask.egg-info/dependency_links.txt +0 -0
  40. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask.egg-info/requires.txt +0 -0
  41. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask.egg-info/top_level.txt +0 -0
  42. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/query_runner/__init__.py +0 -0
  43. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/query_runner/clickhouse.py +0 -0
  44. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/query_runner/kingbase.py +0 -0
  45. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/query_runner/mysql.py +0 -0
  46. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/query_runner/pg.py +0 -0
  47. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/settings/__init__.py +0 -0
  48. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/settings/helpers.py +0 -0
  49. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/utils/__init__.py +0 -0
  50. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/utils/requests_session.py +0 -0
  51. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/setup.cfg +0 -0
  52. {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-flask
3
- Version: 0.0.97
3
+ Version: 0.0.99
4
4
  Summary: lesscode-flask 是基于flask的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://lesscode-flask
6
6
  Author: Chao.yy
@@ -1,4 +1,4 @@
1
- __version__ = '0.0.97'
1
+ __version__ = '0.0.99'
2
2
 
3
3
  import functools
4
4
  import logging
@@ -46,9 +46,7 @@ class AccessLogHandler(Handler):
46
46
  resource_label = "-"
47
47
  client_id = "-"
48
48
  try:
49
- url_info = RedisHelper(app_config.get("REDIS_OAUTH_KEY", "redis")).sync_hgetall(url_info_key,
50
- ["id", "label",
51
- "client_id"])
49
+ url_info = RedisHelper(app_config.get("REDIS_OAUTH_KEY", "redis")).sync_hgetall(url_info_key)
52
50
  if url_info:
53
51
  resource_id = url_info.get("id", "-")
54
52
  resource_label = url_info.get("label", "-")
@@ -0,0 +1,67 @@
1
+ swagger_json = {
2
+ "openapi": "3.0.0",
3
+ "info": {
4
+ "title": "Example API",
5
+ "version": "1.0.0",
6
+ "description": "This is an example API that demonstrates OpenAPI 3.0 features."
7
+ },
8
+ "servers": [
9
+ {
10
+ "url": "https://api.example.com/v1",
11
+ "description": "Main production server"
12
+ }
13
+ ],
14
+ "paths": {
15
+ "/api/v1/greet": {
16
+ "get": {
17
+ "summary": "Get a greeting message",
18
+ "description": "This endpoint returns a greeting message to the user.",
19
+ "operationId": "getGreeting",
20
+ "security": [
21
+ {
22
+ "BearerAuth": []
23
+ }
24
+ ],
25
+ "responses": {
26
+ "200": {
27
+ "description": "A greeting message",
28
+ "content": {
29
+ "application/json": {
30
+ "schema": {
31
+ "$ref": "#/components/schemas/Greeting"
32
+ }
33
+ }
34
+ }
35
+ },
36
+ "400": {
37
+ "description": "Bad Request - Missing or invalid Authorization header"
38
+ }
39
+ }
40
+ }
41
+ }
42
+ },
43
+ "components": {
44
+ "securitySchemes": {
45
+ "BearerAuth": {
46
+ "type": "http",
47
+ "scheme": "bearer",
48
+ "bearerFormat": "JWT"
49
+ }
50
+ },
51
+ "schemas": {
52
+ "Greeting": {
53
+ "type": "object",
54
+ "properties": {
55
+ "message": {
56
+ "type": "string",
57
+ "example": "Hello, John Doe!"
58
+ },
59
+ "lang": {
60
+ "type": "string",
61
+ "example": "en"
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
@@ -38,12 +38,20 @@ def get_request_body(body, required, request_type):
38
38
  def get_header_template():
39
39
  return [
40
40
  {
41
- "name": "Authorization",
41
+ "name": "App-Key",
42
42
  "in": "header",
43
43
  "required": False,
44
44
  "schema": {
45
45
  "type": "string",
46
- "description": "Authorization token"
46
+ "description": "App-Key"
47
+ }
48
+ }, {
49
+ "name": "Data-Source-Id",
50
+ "in": "header",
51
+ "required": False,
52
+ "schema": {
53
+ "type": "string",
54
+ "description": "Data-Source-Id"
47
55
  }
48
56
  }
49
57
  ]
@@ -28,7 +28,12 @@ def generate_openapi_spec(app):
28
28
  "tags": [rule.endpoint.split('.')[0]],
29
29
  # "description": f"Description for {method} {rule.rule}",
30
30
  "description": description,
31
- "responses": get_response_template()
31
+ "responses": get_response_template(),
32
+ "security": [
33
+ {
34
+ "BearerAuth": []
35
+ }
36
+ ],
32
37
  }
33
38
 
34
39
  if method_ == "post":
@@ -63,7 +68,16 @@ def generate_openapi_spec(app):
63
68
  "version": "1.0.0"
64
69
  },
65
70
  "tags": [{"name": k} for k in app.blueprints],
66
- "paths": paths
71
+ "paths": paths,
72
+ "components": {
73
+ "securitySchemes": {
74
+ "BearerAuth": {
75
+ "type": "http",
76
+ "scheme": "bearer",
77
+ "bearerFormat": "JWT"
78
+ }
79
+ }
80
+ }
67
81
  }
68
82
  return openapi_spec
69
83
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-flask
3
- Version: 0.0.97
3
+ Version: 0.0.99
4
4
  Summary: lesscode-flask 是基于flask的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://lesscode-flask
6
6
  Author: Chao.yy
@@ -23,6 +23,7 @@ lesscode_flask/service/access_log_service.py
23
23
  lesscode_flask/service/base_service.py
24
24
  lesscode_flask/setting/__init__.py
25
25
  lesscode_flask/setup/__init__.py
26
+ lesscode_flask/static/swagger.py
26
27
  lesscode_flask/utils/__init__.py
27
28
  lesscode_flask/utils/helpers.py
28
29
  lesscode_flask/utils/decorator/__init__.py
@@ -1,25 +1,11 @@
1
1
  import logging
2
- import sys
3
- import urllib.request
4
- import urllib.parse
5
2
  import urllib.error
6
- from importlib import import_module
7
-
8
- try:
9
- requests = import_module("requests")
10
- except ImportError as e:
11
- raise Exception(f"requests is not exist,run:pip install requests==2.32.3")
12
- from requests.auth import HTTPBasicAuth
3
+ import urllib.parse
13
4
 
5
+ from lesscode_flask.utils.request.request import get_basic_auth, sync_common_request_origin
14
6
  from redash.query_runner import *
15
7
  from redash.utils import json_dumps, json_loads
16
8
 
17
- try:
18
- import http.client as http_client
19
- except ImportError:
20
- # Python 2
21
- import http.client as http_client
22
-
23
9
  logger = logging.getLogger(__name__)
24
10
 
25
11
  ELASTICSEARCH_TYPES_MAPPING = {
@@ -75,8 +61,6 @@ class BaseElasticSearch(BaseQueryRunner):
75
61
  self.syntax = "json"
76
62
 
77
63
  if self.DEBUG_ENABLED:
78
- http_client.HTTPConnection.debuglevel = 1
79
-
80
64
  # you need to initialize logging, otherwise you will not see anything from requests
81
65
  logging.basicConfig()
82
66
  logging.getLogger().setLevel(logging.DEBUG)
@@ -94,25 +78,18 @@ class BaseElasticSearch(BaseQueryRunner):
94
78
  basic_auth_password = self.configuration.get("basic_auth_password", None)
95
79
  self.auth = None
96
80
  if basic_auth_user and basic_auth_password:
97
- self.auth = HTTPBasicAuth(basic_auth_user, basic_auth_password)
81
+ self.auth = get_basic_auth(basic_auth_user, basic_auth_password)
98
82
 
99
83
  def _get_mappings(self, url):
100
- mappings = {}
101
84
  error = None
102
85
  try:
103
- r = requests.get(url, auth=self.auth)
86
+ r = sync_common_request_origin(url=url, method="get", auth=self.auth)
104
87
  r.raise_for_status()
105
88
 
106
89
  mappings = r.json()
107
- except requests.HTTPError as e:
90
+ except Exception as e:
108
91
  logger.exception(e)
109
- error = "Failed to execute query. Return Code: {0} Reason: {1}".format(
110
- r.status_code, r.text
111
- )
112
- mappings = None
113
- except requests.exceptions.RequestException as e:
114
- logger.exception(e)
115
- error = "Connection refused"
92
+ error = f"Failed to execute query. Reason: {e}"
116
93
  mappings = None
117
94
 
118
95
  return mappings, error
@@ -178,10 +155,10 @@ class BaseElasticSearch(BaseQueryRunner):
178
155
  return list(schema.values())
179
156
 
180
157
  def _parse_results(
181
- self, mappings, result_fields, raw_result, result_columns, result_rows
158
+ self, mappings, result_fields, raw_result, result_columns, result_rows
182
159
  ):
183
160
  def add_column_if_needed(
184
- mappings, column_name, friendly_name, result_columns, result_columns_index
161
+ mappings, column_name, friendly_name, result_columns, result_columns_index
185
162
  ):
186
163
  if friendly_name not in result_columns_index:
187
164
  result_columns.append(
@@ -210,7 +187,7 @@ class BaseElasticSearch(BaseQueryRunner):
210
187
  row[key] = value
211
188
 
212
189
  def collect_aggregations(
213
- mappings, rows, parent_key, data, row, result_columns, result_columns_index
190
+ mappings, rows, parent_key, data, row, result_columns, result_columns_index
214
191
  ):
215
192
  if isinstance(data, dict):
216
193
  for key, value in data.items():
@@ -345,20 +322,13 @@ class BaseElasticSearch(BaseQueryRunner):
345
322
 
346
323
  def test_connection(self):
347
324
  try:
348
- r = requests.get(
349
- "{0}/_cluster/health".format(self.server_url), auth=self.auth
350
- )
325
+ r = sync_common_request_origin(url="{0}/_cluster/health".format(self.server_url), method="get",
326
+ auth=self.auth
327
+ )
351
328
  r.raise_for_status()
352
- except requests.HTTPError as e:
329
+ except Exception as e:
353
330
  logger.exception(e)
354
- raise Exception(
355
- "Failed to execute query. Return Code: {0} Reason: {1}".format(
356
- r.status_code, r.text
357
- )
358
- )
359
- except requests.exceptions.RequestException as e:
360
- logger.exception(e)
361
- raise Exception("Connection refused")
331
+ raise Exception(f"Failed to execute query.Reason: {e}")
362
332
 
363
333
 
364
334
  class Kibana(BaseElasticSearch):
@@ -367,10 +337,10 @@ class Kibana(BaseElasticSearch):
367
337
  return True
368
338
 
369
339
  def _execute_simple_query(
370
- self, url, auth, _from, mappings, result_fields, result_columns, result_rows
340
+ self, url, auth, _from, mappings, result_fields, result_columns, result_rows
371
341
  ):
372
342
  url += "&from={0}".format(_from)
373
- r = requests.get(url, auth=self.auth)
343
+ r = sync_common_request_origin(url=url, method="get", auth=self.auth)
374
344
  r.raise_for_status()
375
345
 
376
346
  raw_result = r.json()
@@ -442,15 +412,9 @@ class Kibana(BaseElasticSearch):
442
412
 
443
413
  # json_data = json_dumps({"columns": result_columns, "rows": result_rows})
444
414
  json_data = {"columns": result_columns, "rows": result_rows}
445
- except requests.HTTPError as e:
446
- logger.exception(e)
447
- error = "Failed to execute query. Return Code: {0} Reason: {1}".format(
448
- r.status_code, r.text
449
- )
450
- json_data = None
451
- except requests.exceptions.RequestException as e:
415
+ except Exception as e:
452
416
  logger.exception(e)
453
- error = "Connection refused"
417
+ error = f"Failed to execute query. Reason: {e}"
454
418
  json_data = None
455
419
 
456
420
  return json_data, error
@@ -488,7 +452,7 @@ class ElasticSearch(BaseElasticSearch):
488
452
 
489
453
  logger.debug("Using URL: %s", url)
490
454
  logger.debug("Using query: %s", query_dict)
491
- r = requests.get(url, json=query_dict, auth=self.auth)
455
+ r = sync_common_request_origin(url=url, method="get", json=query_dict, auth=self.auth)
492
456
  r.raise_for_status()
493
457
  logger.debug("Result: %s", r.json())
494
458
 
@@ -499,18 +463,9 @@ class ElasticSearch(BaseElasticSearch):
499
463
  )
500
464
 
501
465
  json_data = json_dumps({"columns": result_columns, "rows": result_rows})
502
- except (KeyboardInterrupt, JobTimeoutException):
503
- logger.exception(e)
504
- raise
505
- except requests.HTTPError as e:
506
- logger.exception(e)
507
- error = "Failed to execute query. Return Code: {0} Reason: {1}".format(
508
- r.status_code, r.text
509
- )
510
- json_data = None
511
- except requests.exceptions.RequestException as e:
466
+ except Exception as e:
512
467
  logger.exception(e)
513
- error = "Connection refused"
468
+ error = f"Failed to execute query. Reason: {e}"
514
469
  json_data = None
515
470
 
516
471
  return json_data, error