lesscode-flask 0.1.65__tar.gz → 0.1.67__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 (59) hide show
  1. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/PKG-INFO +1 -1
  2. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/__init__.py +1 -1
  3. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/app.py +1 -1
  4. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/user.py +9 -2
  5. lesscode_flask-0.1.67/lesscode_flask/utils/dify.py +351 -0
  6. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask.egg-info/PKG-INFO +1 -1
  7. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask.egg-info/SOURCES.txt +1 -0
  8. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/README.md +0 -0
  9. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/db/__init__.py +0 -0
  10. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/db/datasource.py +0 -0
  11. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/db/executor.py +0 -0
  12. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/export_data/__init__.py +0 -0
  13. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/export_data/data_download_handler.py +0 -0
  14. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/log/access_log_handler.py +0 -0
  15. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/access_log.py +0 -0
  16. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/base_model.py +0 -0
  17. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/parameterized_query.py +0 -0
  18. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/resource_param_template.py +0 -0
  19. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/model/response_result.py +0 -0
  20. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/service/access_log_service.py +0 -0
  21. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/service/base_service.py +0 -0
  22. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/service/resource_param_template_service.py +0 -0
  23. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/setting/__init__.py +0 -0
  24. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/setup/__init__.py +0 -0
  25. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/signals.py +0 -0
  26. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/static/swagger.py +0 -0
  27. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/__init__.py +0 -0
  28. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/decorator/__init__.py +0 -0
  29. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/decorator/cache.py +0 -0
  30. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/decorator/swagger.py +0 -0
  31. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/file/file_exporter.py +0 -0
  32. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/file/file_utils.py +0 -0
  33. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/helpers.py +0 -0
  34. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/json/NotSortJSONProvider.py +0 -0
  35. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/oss/__init__.py +0 -0
  36. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/oss/ks3_oss.py +0 -0
  37. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/redis/redis_helper.py +0 -0
  38. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/request/request.py +0 -0
  39. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/swagger/swagger_template.py +0 -0
  40. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/swagger/swagger_util.py +0 -0
  41. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/task/__init__.py +0 -0
  42. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/task/task_helper.py +0 -0
  43. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/utils/thread/thread_utils.py +0 -0
  44. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask/wsgi.py +0 -0
  45. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask.egg-info/dependency_links.txt +0 -0
  46. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask.egg-info/requires.txt +0 -0
  47. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/lesscode_flask.egg-info/top_level.txt +0 -0
  48. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/query_runner/__init__.py +0 -0
  49. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/query_runner/clickhouse.py +0 -0
  50. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/query_runner/elasticsearch.py +0 -0
  51. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/query_runner/kingbase.py +0 -0
  52. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/query_runner/mysql.py +0 -0
  53. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/query_runner/pg.py +0 -0
  54. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/settings/__init__.py +0 -0
  55. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/settings/helpers.py +0 -0
  56. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/utils/__init__.py +0 -0
  57. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/redash/utils/requests_session.py +0 -0
  58. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/setup.cfg +0 -0
  59. {lesscode_flask-0.1.65 → lesscode_flask-0.1.67}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-flask
3
- Version: 0.1.65
3
+ Version: 0.1.67
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.1.65'
1
+ __version__ = '0.1.67'
2
2
 
3
3
  import functools
4
4
  import logging
@@ -75,7 +75,7 @@ class Lesscoder(Flask):
75
75
  elif str(access) == "2": # 需要权限
76
76
  if current_user.is_anonymous_user:
77
77
  ResponseResult.fail("请登录后访问", status_code="403", http_code="403")
78
- if not current_user.has_permission(symbol):
78
+ if not current_user.has_permission(url):
79
79
  ResponseResult.fail("请获取授权后访问", status_code="403", http_code="403")
80
80
  return v
81
81
 
@@ -13,18 +13,24 @@ except ImportError as e:
13
13
 
14
14
 
15
15
  class PermissionsCheckMixin:
16
+
16
17
  def has_permission(self, permission):
17
18
  return self.has_permissions((permission,))
18
19
 
19
20
  def has_permissions(self, permissions):
20
21
  has_permissions = reduce(
21
22
  lambda a, b: a and b,
22
- [permission in self.permissions for permission in permissions],
23
+ [permission in self.permissions_url for permission in permissions],
23
24
  True,
24
25
  )
25
26
 
26
27
  return has_permissions
27
28
 
29
+ # 权限集合(symbol)
30
+ permissions = []
31
+ # 权限集合(url)
32
+ permissions_url = []
33
+
28
34
 
29
35
  class User(flask_login.UserMixin, PermissionsCheckMixin):
30
36
  """
@@ -33,7 +39,8 @@ class User(flask_login.UserMixin, PermissionsCheckMixin):
33
39
 
34
40
  def __init__(self, id="AnonymousUserId", username="AnonymousUser", display_name="匿名用户", phone_no: str = None,
35
41
  email: str = None,
36
- type: int = 0, account_status: str = None, permissions=[], permissions_url=[],roleIds=[], client_id: str = None,
42
+ type: int = 0, account_status: str = None, permissions=[], permissions_url=[], roleIds=[],
43
+ client_id: str = None,
37
44
  sub: str = None):
38
45
  # '账号id',
39
46
  self.id = id
@@ -0,0 +1,351 @@
1
+ import json
2
+ import uuid
3
+
4
+ import requests
5
+ from flask import current_app
6
+
7
+ from lesscode_flask.model.user import flask_login
8
+ from lesscode_flask.utils.helpers import app_config
9
+
10
+
11
+ # def dify_messages(dify_server_url: str, api_key, query: str = None, inputs: dict = None, response_mode="streaming",
12
+ # mode: str = "chat", user_id: str = None, conversation_id: str = ""):
13
+ # """
14
+ # 调用dify 的应用api接口
15
+ #
16
+ # :param dify_server_url: dify服务地址
17
+ # :param api_key: api key
18
+ # :param query: 用户查询语句
19
+ # :param inputs: 调用参数
20
+ # :param response_mode: 响应类型 streaming:流式
21
+ # :param mode: 应用类型(# 聊天助手:chat 文本生成:completion 聊天流程:advanced-chat 工作流:workflow Agent:agent-chat)
22
+ # :param user_id: 调用人user_id
23
+ # :return:
24
+ # """
25
+ # if user_id is None:
26
+ # user_id = uuid.uuid4().hex
27
+ # data = {
28
+ # "inputs": inputs,
29
+ # "response_mode": response_mode,
30
+ # "user": user_id,
31
+ # "conversation_id": conversation_id
32
+ # }
33
+ # if "chat" in mode: # 聊天
34
+ # data["query"] = query
35
+ # server_url = dify_server_url + "/v1/chat-messages"
36
+ # elif mode == "completion": # 文本生成
37
+ # if inputs is None:
38
+ # inputs = {"query": query}
39
+ # data["inputs"] = inputs
40
+ # server_url = dify_server_url + "/v1/completion-messages"
41
+ # elif mode == "workflow": # 工作流
42
+ # server_url = dify_server_url + "/v1/workflows/run"
43
+ # headers = {
44
+ # 'Authorization': f'Bearer {api_key}',
45
+ # 'Content-Type': 'application/json'
46
+ # }
47
+ # try:
48
+ # response = requests.post(server_url, headers=headers, json=data, stream=True)
49
+ # for line in response.iter_lines(decode_unicode=True):
50
+ # if line and line != "event: ping": # 过滤掉空行和ping事件
51
+ # if not line.startswith("data: "):
52
+ # message_error = {"event": "message_error", "message": line}
53
+ # yield f'data: {json.dumps(message_error)}\n\n'
54
+ # break
55
+ # yield f"{line}\n\n"
56
+ # except Exception as e:
57
+ # print(f"Error: {e}")
58
+ # yield 'data: {"event": "message_end"}'
59
+
60
+
61
+ # def get_app_key(app_id):
62
+ # difyAppKey = DifyAppKeyService().get_item(app_id)
63
+ # if difyAppKey is None:
64
+ # return "应用不存在"
65
+ # API_KEY = difyAppKey.get("dify_api_key")
66
+ # return API_KEY
67
+
68
+
69
+ def dify_chat_messages(api_key, query: str = None, inputs: dict = None, conversation_id: str = "", files=None,
70
+ response_mode="streaming", user_id: str = None, server_url: str = None):
71
+ """
72
+ 发送对话消息
73
+ :param api_key: API 秘钥
74
+ :param query: 用户查询语句
75
+ :param inputs: 调用参数
76
+ :param conversation_id: 会话 ID
77
+ :param files: 文件列表,适用于传入文件结合文本理解并回答问题
78
+ :param server_url:模型服务地址
79
+ :param response_mode: 响应类型 streaming:流式 ,blocking 阻塞式
80
+ :param user_id: 调用人user_id
81
+ :return:
82
+ """
83
+ if server_url is None:
84
+ server_url = app_config.get("DIFY_SERVER_URL")
85
+ if user_id is None:
86
+ user_id = uuid.uuid4().hex
87
+ data = {
88
+ "inputs": inputs,
89
+ "query": query,
90
+ "response_mode": response_mode,
91
+ "conversation_id": conversation_id,
92
+ "user": user_id,
93
+ "files": files
94
+ # "files": [
95
+ # {
96
+ # "type": "image",
97
+ # "transfer_method": "remote_url",
98
+ # "url": "https://cloud.dify.ai/logo/logo-site.png"
99
+ # }
100
+ # ]
101
+ }
102
+ # if files is not None:
103
+ # data["files"] = files
104
+ # if "chat" in mode: # 聊天
105
+ # data["query"] = query
106
+ # server_url = server_url + "/v1/chat-messages"
107
+ # elif mode == "completion": # 文本生成
108
+ # if inputs is None:
109
+ # inputs = {"query": query}
110
+ # data["inputs"] = inputs
111
+ # server_url = server_url + "/v1/completion-messages"
112
+ # elif mode == "workflow": # 工作流
113
+ # server_url = server_url + "/v1/workflows/run"
114
+ headers = {
115
+ 'Authorization': f'Bearer {api_key}',
116
+ 'Content-Type': 'application/json'
117
+ }
118
+ try:
119
+ response = requests.post(f"{server_url}/v1/chat-messages", headers=headers, json=data, stream=True)
120
+ if "streaming" == response_mode:
121
+ pass
122
+ for line in response.iter_lines(decode_unicode=True):
123
+ if line and line != "event: ping": # 过滤掉空行和ping事件
124
+ if not line.startswith("data: "):
125
+ message_error = {"event": "message_error", "message": line}
126
+ yield f'data: {json.dumps(message_error)}\n\n'
127
+ break
128
+ yield f"{line}\n\n"
129
+ else: # blocking
130
+ res = response.text
131
+ yield res
132
+ except Exception as e:
133
+ if "streaming" == response_mode:
134
+ print(f"Error: {e}")
135
+ yield 'data: {"event": "message_end"}'
136
+ else: # blocking
137
+ return f'{{"event": "message", "answer": "{e}"}}'
138
+
139
+
140
+ def dify_stop_messages(api_key: str, task_id: str, user_id=None, server_url: str = None):
141
+ """
142
+ 停止响应 仅支持流式模式。
143
+ :param api_key: API 秘钥
144
+ :param task_id: 任务 ID,可在流式返回 Chunk 中获取
145
+ :param user_id: 调用人user_id
146
+ :param server_url: 模型服务地址
147
+ :return:
148
+ """
149
+
150
+ if user_id is None:
151
+ user_id = uuid.uuid4().hex
152
+ data = {
153
+ "user": user_id
154
+ }
155
+ headers = {
156
+ 'Authorization': f'Bearer {api_key}',
157
+ 'Content-Type': 'application/json'
158
+ }
159
+ if server_url is None:
160
+ server_url = app_config.get("DIFY_SERVER_URL")
161
+ try:
162
+ requests.post(f"{server_url}/v1/chat-messages/{task_id}/stop", headers=headers, json=data, stream=False)
163
+ finally:
164
+ # 接口固定返回success
165
+ return {
166
+ "result": "success"
167
+ }
168
+
169
+
170
+ def dify_feedbacks(api_key: str, messages_id: str, rating: int, user_id=None, server_url: str = None):
171
+ """
172
+ 用户反馈 点赞
173
+ :param api_key: API 秘钥
174
+ :param messages_id: 消息id
175
+ :param rating: 评价 0:取消 1:like 2:dislike
176
+ :param user_id: 调用人user_id
177
+ :param server_url: 模型服务地址
178
+ :return:
179
+ """
180
+ if user_id is None:
181
+ user_id = uuid.uuid4().hex
182
+ data = {
183
+ "user": user_id
184
+ }
185
+ if server_url is None:
186
+ server_url = app_config.get("DIFY_SERVER_URL")
187
+ if rating == 0:
188
+ data["rating"] = None
189
+ elif rating == 1:
190
+ data["rating"] = "like"
191
+ elif rating == 2:
192
+ data["rating"] = "dislike"
193
+ headers = {
194
+ 'Authorization': f'Bearer {api_key}',
195
+ 'Content-Type': 'application/json'
196
+ }
197
+ try:
198
+ requests.post(f"{server_url}/v1/messages/{messages_id}/feedbacks", headers=headers, json=data, stream=False)
199
+ finally:
200
+ # 接口固定返回success
201
+ return {
202
+ "result": "success"
203
+ }
204
+
205
+
206
+ def dify_history_messages(api_key: str, conversation_id: str, limit: int = 20, first_id: str = None, user_id=None,
207
+ server_url: str = None):
208
+ """
209
+ 获取会话历史消息
210
+ :param api_key: API 秘钥
211
+ :param conversation_id: 会话 ID
212
+ :param first_id: 当前页第一条聊天记录的 ID,默认 null
213
+ :param limit: 一次请求返回多少条聊天记录,默认 20 条。
214
+ :param user_id: 调用人user_id
215
+ :param server_url: 模型服务地址
216
+ :return:
217
+ """
218
+ if user_id is None:
219
+ user_id = uuid.uuid4().hex
220
+ data = {
221
+ "user": user_id,
222
+ "conversation_id": conversation_id,
223
+ "limit": limit,
224
+ "first_id": first_id
225
+ }
226
+ if server_url is None:
227
+ server_url = app_config.get("DIFY_SERVER_URL")
228
+ headers = {
229
+ 'Authorization': f'Bearer {api_key}',
230
+ 'Content-Type': 'application/json'
231
+ }
232
+ response = requests.get(f"{server_url}/v1/messages", headers=headers, params=data)
233
+ return response.json()
234
+
235
+
236
+ def dify_history_conversations(api_key: str, conversation_id: str, limit: int = 20, last_id: str = None, user_id=None,
237
+ server_url: str = None):
238
+ """
239
+ 获取历史会话列表
240
+ 获取当前用户的会话列表,默认返回最近的 20 条。
241
+ :param api_key: API 秘钥
242
+ :param conversation_id: 会话 ID
243
+ :param last_id: (选填)当前页最后面一条记录的 ID,默认 null
244
+ :param limit: 一次请求返回多少条记录,默认 20 条,最大 100 条,最小 1 条。
245
+ :param sort_by: 排序字段,默认 -updated_at(按更新时间倒序排列) 可选值:created_at, -created_at, updated_at, -updated_at 字段前面的符号代表顺序或倒序,-代表倒序
246
+ :param user_id: 调用人user_id
247
+ :param server_url: 模型服务地址
248
+ :return:
249
+ """
250
+ if user_id is None:
251
+ user_id = uuid.uuid4().hex
252
+ data = {
253
+ "user": user_id,
254
+ "conversation_id": conversation_id,
255
+ "limit": limit,
256
+ "last_id": last_id
257
+ }
258
+ if server_url is None:
259
+ server_url = app_config.get("DIFY_SERVER_URL")
260
+ headers = {
261
+ 'Authorization': f'Bearer {api_key}',
262
+ 'Content-Type': 'application/json'
263
+ }
264
+ response = requests.get(f"{server_url}/v1/conversations", headers=headers, params=data)
265
+ return response.json()
266
+
267
+
268
+ def dify_delete_conversations(api_key: str, conversation_id: str, user_id=None,
269
+ server_url: str = None):
270
+ """
271
+ 删除会话
272
+ 获取当前用户的会话列表,默认返回最近的 20 条。
273
+ :param api_key: API 秘钥
274
+ :param conversation_id: 会话 ID
275
+ :param user_id: 调用人user_id
276
+ :param server_url: 模型服务地址
277
+ :return:
278
+ """
279
+ if user_id is None:
280
+ user_id = uuid.uuid4().hex
281
+ data = {
282
+ "user": user_id,
283
+ "conversation_id": conversation_id
284
+ }
285
+ if server_url is None:
286
+ server_url = app_config.get("DIFY_SERVER_URL")
287
+ headers = {
288
+ 'Authorization': f'Bearer {api_key}',
289
+ 'Content-Type': 'application/json'
290
+ }
291
+ response = requests.delete(f"{server_url}/v1/conversations", headers=headers, params=data)
292
+ return response.json()
293
+
294
+
295
+ def dify_conversations_rename(api_key: str, conversation_id: str, name: str = None, auto_generate=False, user_id=None,
296
+ server_url: str = None):
297
+ """
298
+ 会话重命名
299
+ :param api_key: API 秘钥
300
+ :param conversation_id: 会话 ID
301
+ :param name: (选填)名称,若 auto_generate 为 true 时,该参数可不传。
302
+ :param auto_generate: (选填)自动生成标题,默认 false。
303
+ :param user_id: 调用人user_id
304
+ :param server_url: 模型服务地址
305
+ :return:
306
+ """
307
+ if user_id is None:
308
+ user_id = uuid.uuid4().hex
309
+ data = {
310
+ "name": name,
311
+ "auto_generate": auto_generate,
312
+ "user": user_id
313
+ }
314
+ if server_url is None:
315
+ server_url = app_config.get("DIFY_SERVER_URL")
316
+ headers = {
317
+ 'Authorization': f'Bearer {api_key}',
318
+ 'Content-Type': 'application/json'
319
+ }
320
+ response = requests.post(f"{server_url}/v1/conversations/{conversation_id}/name", headers=headers, params=data)
321
+ return response.json()
322
+
323
+
324
+ def dify_files_upload(api_key: str, file, user_id=None,
325
+ server_url: str = None):
326
+ """
327
+ 会话重命名
328
+ :param api_key: API 秘钥
329
+ :param conversation_id: 会话 ID
330
+ :param name: (选填)名称,若 auto_generate 为 true 时,该参数可不传。
331
+ :param auto_generate: (选填)自动生成标题,默认 false。
332
+ :param user_id: 调用人user_id
333
+ :param server_url: 模型服务地址
334
+ :return:
335
+ """
336
+ if user_id is None:
337
+ user_id = uuid.uuid4().hex
338
+ data = {
339
+ "user": user_id
340
+ }
341
+ files = [
342
+ ('file', (file.filename, file, file.content_type))
343
+ ]
344
+ if server_url is None:
345
+ server_url = app_config.get("DIFY_SERVER_URL")
346
+ headers = {
347
+ 'Authorization': f'Bearer {api_key}',
348
+ # 'Content-Type': 'multipart/form-data'
349
+ }
350
+ response = requests.post(f"{server_url}/v1/files/upload", headers=headers, data=data, files=files)
351
+ return response.json()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-flask
3
- Version: 0.1.65
3
+ Version: 0.1.67
4
4
  Summary: lesscode-flask 是基于flask的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://lesscode-flask
6
6
  Author: Chao.yy
@@ -28,6 +28,7 @@ lesscode_flask/setting/__init__.py
28
28
  lesscode_flask/setup/__init__.py
29
29
  lesscode_flask/static/swagger.py
30
30
  lesscode_flask/utils/__init__.py
31
+ lesscode_flask/utils/dify.py
31
32
  lesscode_flask/utils/helpers.py
32
33
  lesscode_flask/utils/decorator/__init__.py
33
34
  lesscode_flask/utils/decorator/cache.py