fastgenerateapi 1.1.9__py2.py3-none-any.whl → 1.1.11__py2.py3-none-any.whl

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.
@@ -8,7 +8,7 @@
8
8
  # d8888P
9
9
 
10
10
 
11
- VERSION = (1, 1, 9)
11
+ VERSION = (1, 1, 11)
12
12
 
13
13
  __version__ = '.'.join(map(str, VERSION))
14
14
 
@@ -9,15 +9,22 @@ class ConnectionManager:
9
9
 
10
10
  @classmethod
11
11
  def add_connection(cls, user_id: str, websocket: WebSocket):
12
+ conn = cls.active_connections.get(user_id)
13
+ if conn:
14
+ conn.close()
12
15
  cls.active_connections[user_id] = websocket
13
16
 
14
17
  @classmethod
15
18
  def del_connection(cls, user_id: str):
16
19
  if user_id in cls.active_connections:
20
+ cls.active_connections[user_id].close()
17
21
  del cls.active_connections[user_id]
18
22
 
19
23
  @classmethod
20
24
  def add_group_connection(cls, group_id: str, user_id: str, connection: WebSocket):
25
+ conn = cls.active_group_connections.get(group_id, {}).get(user_id)
26
+ if conn:
27
+ conn.close()
21
28
  cls.active_group_connections.setdefault(group_id, {})[user_id] = connection
22
29
 
23
30
  @classmethod
@@ -25,6 +32,7 @@ class ConnectionManager:
25
32
  if group_id in cls.active_group_connections:
26
33
  user_dict = cls.active_group_connections[group_id]
27
34
  if user_id in user_dict:
35
+ user_dict[user_id].close()
28
36
  del user_dict[user_id]
29
37
  if not user_dict:
30
38
  del cls.active_group_connections[group_id]
@@ -36,7 +36,7 @@ class Consumer(WebSocketEndpoint):
36
36
  # 断开 删除
37
37
  async def on_disconnect(self, websocket, close_code):
38
38
  if self.group_id and self.user_id:
39
- await ConnectionManager.del_group_connection(self.group_id, self.user_id)
39
+ ConnectionManager.del_group_connection(self.group_id, self.user_id)
40
40
  pass
41
41
 
42
42
  async def check_args(self, group_id, user_id):
@@ -56,7 +56,7 @@ class Consumer(WebSocketEndpoint):
56
56
  await self.error(websocket, code=422, msg="未获取到用户信息")
57
57
  if not await self.check_args(group_id, user_key):
58
58
  await self.error(websocket, code=422, msg="无连接权限")
59
- await ConnectionManager.add_group_connection(group_id, user_key, websocket)
59
+ ConnectionManager.add_group_connection(group_id, user_key, websocket)
60
60
 
61
61
  # 群发消息
62
62
  @classmethod
@@ -1,5 +1,10 @@
1
+ from functools import lru_cache
2
+ from pathlib import Path
3
+ from typing import Union
1
4
 
5
+ import yaml
2
6
  from pydantic import BaseModel
7
+ from pydantic.fields import FieldInfo
3
8
 
4
9
  from fastgenerateapi.settings.redis_settings import RedisSettings
5
10
  from fastgenerateapi.settings.app_settings import AppSettings
@@ -14,78 +19,80 @@ class SettingsModel(BaseModel):
14
19
  # 缓存配置
15
20
  redis_settings: RedisSettings = RedisSettings()
16
21
 
17
- # pydantic v2 不支持 ModelField, v.type_
18
- # @classmethod
19
- # def generate_file(cls, path='./.env'):
20
- # """
21
- # 生成配置文件
22
- # .env 会增加前缀
23
- # .yaml 忽略前缀
24
- # :param path: 可选 .env / application.yaml
25
- # :return:
26
- # """
27
- # content = ''
28
- # setting_models = cls.__fields__.copy()
29
- # if path.__contains__('.env'):
30
- # for k, v in setting_models.items():
31
- # if issubclass(type(v), ModelField):
32
- # sub_setting_class = v.type_
33
- # content += f"[{sub_setting_class.__name__}]\n"
34
- # fields = sub_setting_class.__fields__.copy()
35
- # for k, v in fields.items():
36
- # field_name = f'{sub_setting_class.Config.env_prefix}{k}'
37
- # if v.field_info.description is None:
38
- # content += f"{field_name}={v.default}\n"
39
- # else:
40
- # content += f"# {v.field_info.description}\n{field_name}={v.default}\n"
41
- # content += "\n"
42
- # elif path.__contains__('.yaml'):
43
- # for k, v in setting_models.items():
44
- # if issubclass(type(v), ModelField):
45
- # sub_setting_class = v.type_
46
- # content += f"{sub_setting_class.__name__}:\n"
47
- # fields = sub_setting_class.__fields__.copy()
48
- # for k, v in fields.items():
49
- # content += f" {k}: {v.default}"
50
- # if v.field_info.description is None:
51
- # content += f"\n"
52
- # else:
53
- # content += f" # {v.field_info.description}\n"
54
- # content += "\n"
55
- # with open(file=path, mode='w', encoding='utf-8') as f:
56
- # f.writelines(content)
57
- #
58
- # @classmethod
59
- # @lru_cache
60
- # def get_global_settings(cls, path: Union[types.Path, str, None] = '.env'):
61
- # """
62
- # get global settings and set into cache
63
- # :param path: 可选 .env / application.yaml
64
- # :return:
65
- # """
66
- # setting_models = cls.__fields__.copy()
67
- #
68
- # setting_dict = {}
69
- # if str(path).__contains__('.env'):
70
- # for k, v in setting_models.items():
71
- # if issubclass(type(v), ModelField):
72
- # sub_setting_class = v.type_
73
- # setting_dict[k] = sub_setting_class(_env_file=str(path))
74
- # elif str(path).__contains__('.yaml'):
75
- # with open(path, 'r', encoding='utf-8') as file:
76
- # data_dict = yaml.safe_load(file)
77
- # for k, v in setting_models.items():
78
- # if issubclass(type(v), ModelField):
79
- # sub_setting_class = v.type_
80
- # setting_dict[k] = sub_setting_class(**data_dict.get(sub_setting_class.__name__, {}))
81
- #
82
- # setting_data = cls(**setting_dict)
83
- # global settings
84
- # settings.app_settings = setting_data.app_settings
85
- # settings.system_settings = setting_data.system_settings
86
- # settings.redis_settings = setting_data.redis_settings
87
- # return setting_data
22
+ @classmethod
23
+ def generate_file(cls, path='./.env'):
24
+ """
25
+ 生成配置文件
26
+ .env 会增加前缀
27
+ .yaml 忽略前缀
28
+ :param path: 可选 .env / application.yaml
29
+ :return:
30
+ """
31
+ content = ''
32
+ setting_models = cls.model_fields.copy()
33
+ if path.__contains__('.env'):
34
+ for k, v in setting_models.items():
35
+ if isinstance(v, FieldInfo):
36
+ content += f"[{v.annotation.__name__}]\n"
37
+ env_prefix = v.annotation.model_config.get("env_prefix", "")
38
+ fields = v.annotation.model_fields.copy()
39
+ for k, v in fields.items():
40
+ field_name = f'{env_prefix}{k}'
41
+ if v.description is None:
42
+ content += f"{field_name}={v.default}\n"
43
+ else:
44
+ content += f"# {v.description}\n{field_name}={v.default}\n"
45
+ content += "\n"
46
+ elif path.__contains__('.yaml'):
47
+ for k, v in setting_models.items():
48
+ if isinstance(v, FieldInfo):
49
+ content += f"[{v.annotation.__name__}]\n"
50
+ env_prefix = v.annotation.model_config.get("env_prefix", "")
51
+ fields = v.annotation.model_fields.copy()
52
+ for k, v in fields.items():
53
+ field_name = f'{env_prefix}{k}'
54
+ content += f" {field_name}: {v.default}"
55
+ if v.description is None:
56
+ content += f"\n"
57
+ else:
58
+ content += f" # {v.description}\n"
59
+ content += "\n"
60
+ with open(file=path, mode='w', encoding='utf-8') as f:
61
+ f.writelines(content)
62
+
63
+ @classmethod
64
+ @lru_cache
65
+ def get_global_settings(cls, path: Union[Path, str, None] = '.env'):
66
+ """
67
+ get global settings and set into cache
68
+ :param path: 可选 .env / application.yaml
69
+ :return:
70
+ """
71
+ setting_models = cls.model_fields.copy()
72
+
73
+ setting_dict = {}
74
+ if str(path).__contains__('.env'):
75
+ for k, v in setting_models.items():
76
+ if isinstance(v, FieldInfo):
77
+ setting_dict[k] = v.annotation(_env_file=str(path))
78
+ elif str(path).__contains__('.yaml'):
79
+ with open(path, 'r', encoding='utf-8') as file:
80
+ data_dict = yaml.safe_load(file)
81
+ for k, v in setting_models.items():
82
+ if isinstance(v, FieldInfo):
83
+ setting_dict[k] = v.annotation(**data_dict.get(v.annotation.__name__, {}))
84
+
85
+ setting_data = cls(**setting_dict)
86
+ global settings
87
+ settings.app_settings = setting_data.app_settings
88
+ settings.system_settings = setting_data.system_settings
89
+ settings.redis_settings = setting_data.redis_settings
90
+ return setting_data
88
91
 
89
92
 
90
93
  settings = SettingsModel()
91
94
 
95
+
96
+ if __name__ == '__main__':
97
+ settings.generate_file()
98
+
@@ -21,7 +21,6 @@ class DBSettings(BaseSettings):
21
21
  return f"{self.DB_TYPE.lower()}://{self.DB_USERNAME}:{self.DB_PASSWORD}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_DATABASE}"
22
22
 
23
23
  model_config = SettingsConfigDict(
24
- env_prefix="",
25
24
  env_file=".env",
26
25
  case_sensitive=True,
27
26
  extra='ignore'
@@ -4,7 +4,7 @@ from pydantic import Field
4
4
  from pydantic_settings import BaseSettings, SettingsConfigDict
5
5
 
6
6
 
7
- class FileServerSettings(BaseSettings):
7
+ class FileSettings(BaseSettings):
8
8
  """
9
9
  文件配置
10
10
  """
@@ -13,7 +13,6 @@ class FileServerSettings(BaseSettings):
13
13
  FILE_ROOT: Optional[str] = Field(default='static', description="文件储存路径", title="file storage path")
14
14
 
15
15
  model_config = SettingsConfigDict(
16
- env_prefix="FILESERVER_",
17
16
  env_file=".env",
18
17
  case_sensitive=True,
19
18
  extra='ignore'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.1.9
3
+ Version: 1.1.11
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -1,5 +1,5 @@
1
1
  fastgenerateapi/__init__.py,sha256=eh2qtp7FbjrgaRX5b3H3UWpasFdNHbVFqLUhpqVbaTU,1287
2
- fastgenerateapi/__version__.py,sha256=sI8rW3wVqSh9IB7senA2sM8kxpevmXiyJUcRPE0EWQk,496
2
+ fastgenerateapi/__version__.py,sha256=-n7dhyb2qQZHtAwcRPpSC9Z4U1Vo6n0LrAe9Qiooq-I,497
3
3
  fastgenerateapi/api_view/__init__.py,sha256=zkaTX5JxsNfjF-dFeEbHfUB58vhPMjm6Iiqx9HgJOrY,14
4
4
  fastgenerateapi/api_view/api_view.py,sha256=mfD8GB-hnyI2XO3tkSOlEa2FfBLdq0_Wqvp8gFrXFKU,1160
5
5
  fastgenerateapi/api_view/base_view.py,sha256=s8f6zdoRqPRmo6o2FqHZG2MKcn1gc8JELix8VetVo3k,9810
@@ -32,8 +32,8 @@ fastgenerateapi/cache/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
32
32
  fastgenerateapi/cache/cache_decorator.py,sha256=u6dfanX2GMkjsJANgT8qXuEgw1fSPXFsmpL05b0PI44,579
33
33
  fastgenerateapi/cache/key_builder.py,sha256=6Vudd19EGg1IUGT5ftPDqLUNCCqXzmQNV69zBfjGf9A,503
34
34
  fastgenerateapi/channel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- fastgenerateapi/channel/connection_manager.py,sha256=BrsS0TMfgMBu3AQEb2RJwgfEUW27-e3bdZC0lM3qCls,1092
36
- fastgenerateapi/channel/consumer.py,sha256=1AZFAoeUZHZYZYJbN9s4pzI4xTG8uD0FbiSvmwjRGD8,3221
35
+ fastgenerateapi/channel/connection_manager.py,sha256=Z59pFnQSsFWSPvdH0b_8m1KTFVYtqREXzkJvgpej4gc,1405
36
+ fastgenerateapi/channel/consumer.py,sha256=9zZ3ctN88ncMHRrWndVSRTeqvMExyU3O3hq38ku7lzw,3209
37
37
  fastgenerateapi/channel/websocket_view.py,sha256=lG9rYMO_FTdULi--oEdqCtdguR5ZM8Uzrk6f3z-86zo,2656
38
38
  fastgenerateapi/controller/__init__.py,sha256=eM5a3k_G0bf-k_WcwfcBbI-M3kLFJIITBWX85lVyClE,316
39
39
  fastgenerateapi/controller/filter_controller.py,sha256=PX-2oOo7WGZWePjm318RCbIlLIdeYwHKG-u1onpjB24,5030
@@ -83,10 +83,10 @@ fastgenerateapi/schemas_factory/response_factory.py,sha256=C-E3lqIdfIJCIZhvmSaAi
83
83
  fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py,sha256=dhgMvXZIq4av7puIMiQOTuVqNOuBoMvBZVd98GWJTRg,1810
84
84
  fastgenerateapi/schemas_factory/update_schema_factory.py,sha256=E-86vF98Ed92Q2VFqtS35xqxr_c34du9ok42JBfnj1g,3729
85
85
  fastgenerateapi/settings/__init__.py,sha256=dlyJb7BNh8Svau-UOrV4pxfoSYnNTA6eE41fu43vlT8,173
86
- fastgenerateapi/settings/all_settings.py,sha256=riAFFyOVRszZ3DZUVcudHgCgYrICnusuuFcth9zfeDM,3889
86
+ fastgenerateapi/settings/all_settings.py,sha256=ylABCKJzh_US4ZfZQgDEYFYm75Zz-0mL8pqziFdgudY,3795
87
87
  fastgenerateapi/settings/app_settings.py,sha256=FgRVIrWUmfvfDohP2pP4JO7nFevUPEG3MNuUyfjM9BA,7294
88
- fastgenerateapi/settings/db_settings.py,sha256=ClmQg00bpn-EWnrdKjjJ5_emPoa1eEDf0oBoNGp7g3M,1594
89
- fastgenerateapi/settings/file_settings.py,sha256=Vtzp_LV4tBYQDwNOJfY3QyoQGvDEv_KZ3N_HR9md1-o,898
88
+ fastgenerateapi/settings/db_settings.py,sha256=duTgLjMHO6MTDfEZ2tkAGiSXrTKuHSLBJW00l5_rv7g,1570
89
+ fastgenerateapi/settings/file_settings.py,sha256=8Ra5H0nxRp1r_Ib_RGbNO0rUFaxqYMjuJT9A4fHE3Oo,857
90
90
  fastgenerateapi/settings/jwt_settings.py,sha256=mRtzLZz1bntrl6UXAnIq6xilEEN8NS8oJSv62CGXOEs,971
91
91
  fastgenerateapi/settings/otlp_settings.py,sha256=4haWpSdJBeor-rq_rBOgQl6oYRv9eppdwm1yWGt6GyE,3161
92
92
  fastgenerateapi/settings/redis_settings.py,sha256=6T-KqCj2Jva7SarDCExZZbdvr54u6n08mEJ0gQhlUoc,700
@@ -103,8 +103,8 @@ fastgenerateapi/utils/snowflake.py,sha256=GiFVkE10sPiqJ094sMfrPsaV7Y9Y3c1djrSfgs
103
103
  fastgenerateapi/utils/str_util.py,sha256=c-jUlCFw-Dz4W1W9Jc1TqGZw3JXu-qN5ovnE6fjc9j0,3445
104
104
  fastgenerateapi/utils/swagger_to_js.py,sha256=pPPTag6TYtxdbKMHD3m8lJvc8Gv9HC97CGHt4esU1-E,530
105
105
  script/__init__.py,sha256=26UWatnbm6ZIwQMuu9NNzQ0IW1ACO4Oe9caModuTpWM,4
106
- fastgenerateapi-1.1.9.dist-info/LICENSE,sha256=gcuuhKKc5-dwvyvHsXjlC9oM6N5gZ6umYbC8ewW1Yvg,35821
107
- fastgenerateapi-1.1.9.dist-info/METADATA,sha256=dfLtlXB1ICGWrrJIb2aHRbe0j0yOYHbjZcajqSbpWxU,5960
108
- fastgenerateapi-1.1.9.dist-info/WHEEL,sha256=iYlv5fX357PQyRT2o6tw1bN-YcKFFHKqB_LwHO5wP-g,110
109
- fastgenerateapi-1.1.9.dist-info/top_level.txt,sha256=CW2SlpYjTRdacF-5ufnPMtwpYcR0XYn_bDxa2ZrrTBI,23
110
- fastgenerateapi-1.1.9.dist-info/RECORD,,
106
+ fastgenerateapi-1.1.11.dist-info/LICENSE,sha256=gcuuhKKc5-dwvyvHsXjlC9oM6N5gZ6umYbC8ewW1Yvg,35821
107
+ fastgenerateapi-1.1.11.dist-info/METADATA,sha256=jFaw2DlNnKiSf98Co48jlHrprvW8sKQjehfXfStj3to,5961
108
+ fastgenerateapi-1.1.11.dist-info/WHEEL,sha256=iYlv5fX357PQyRT2o6tw1bN-YcKFFHKqB_LwHO5wP-g,110
109
+ fastgenerateapi-1.1.11.dist-info/top_level.txt,sha256=CW2SlpYjTRdacF-5ufnPMtwpYcR0XYn_bDxa2ZrrTBI,23
110
+ fastgenerateapi-1.1.11.dist-info/RECORD,,