fastgenerateapi 1.1.7__tar.gz → 1.1.9__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.
Potentially problematic release.
This version of fastgenerateapi might be problematic. Click here for more details.
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/PKG-INFO +1 -1
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/__version__.py +1 -1
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/base_view.py +8 -3
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/create_view.py +4 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/delete_filter_view.py +7 -2
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/delete_tree_view.py +8 -2
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/delete_view.py +8 -2
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/get_all_view.py +8 -4
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/get_one_view.py +9 -3
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/get_relation_view.py +3 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/get_tree_view.py +3 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/base_mixin.py +1 -1
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/response_mixin.py +4 -4
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/switch_view.py +9 -3
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/update_relation_view.py +4 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/update_view.py +4 -0
- fastgenerateapi-1.1.9/fastgenerateapi/channel/connection_manager.py +30 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/channel/consumer.py +25 -20
- fastgenerateapi-1.1.9/fastgenerateapi/channel/websocket_view.py +83 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/example/models.py +4 -4
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/model/base_model.py +11 -2
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/my_fields/enum_field.py +13 -10
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/schemas_factory/filter_schema_factory.py +5 -1
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +6 -6
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/schemas_factory/response_factory.py +3 -3
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/settings/app_settings.py +14 -5
- fastgenerateapi-1.1.9/fastgenerateapi/settings/db_settings.py +60 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/settings/file_settings.py +13 -6
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/settings/jwt_settings.py +13 -6
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/settings/otlp_settings.py +14 -7
- fastgenerateapi-1.1.9/fastgenerateapi/settings/redis_settings.py +23 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/settings/sms_settings.py +13 -6
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/settings/system_settings.py +8 -2
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/utils/auto_discover.py +2 -2
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/utils/snowflake.py +1 -1
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi.egg-info/PKG-INFO +1 -1
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi.egg-info/SOURCES.txt +1 -0
- fastgenerateapi-1.1.7/fastgenerateapi/channel/websocket_view.py +0 -25
- fastgenerateapi-1.1.7/fastgenerateapi/settings/db_settings.py +0 -69
- fastgenerateapi-1.1.7/fastgenerateapi/settings/redis_settings.py +0 -16
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/LICENSE +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/README.md +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/api_view.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/utils/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/utils/docx_util.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/utils/file_util.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/utils/pdf_util.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/utils/xlsx_util.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/utils/zip_util.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/sql_get_view.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/cache/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/cache/cache_decorator.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/cache/key_builder.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/channel/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/controller/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/controller/filter_controller.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/controller/router_controller.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/controller/rpc_controller.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/controller/search_controller.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/controller/ws_controller.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/data_type/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/data_type/data_type.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/deps/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/deps/filter_params_deps.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/deps/paginator_deps.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/deps/tree_params_deps.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/example/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/example/routers.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/example/schemas.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/example/views.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/fastapi_utils/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/fastapi_utils/all.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/fastapi_utils/param_utils.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/fastapi_utils/response_utils.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/model/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/my_fields/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/my_fields/aes_field.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/my_fields/pk_field.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/my_fields/pwd_field.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/my_fields/soft_delete_field.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/my_fields/validator.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/pydantic_utils/base_model.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/pydantic_utils/base_settings.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/schemas_factory/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/schemas_factory/common_function.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/schemas_factory/common_schema_factory.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/schemas_factory/create_schema_factory.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/schemas_factory/update_schema_factory.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/settings/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/settings/all_settings.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/utils/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/utils/aes.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/utils/exception.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/utils/file_utils.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/utils/pwd_utils.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/utils/ramdom_utils.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/utils/str_util.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/utils/swagger_to_js.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi.egg-info/top_level.txt +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/script/__init__.py +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/setup.cfg +0 -0
- {fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/setup.py +0 -0
|
@@ -78,9 +78,14 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
|
|
|
78
78
|
return self.error(msg="relation_model_class not allow None")
|
|
79
79
|
return self.get_active_queryset(self.relation_model_class)
|
|
80
80
|
|
|
81
|
-
async def get_object(self, pk):
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
async def get_object(self, pk, model_class=None, is_with_prefetch=False):
|
|
82
|
+
if model_class:
|
|
83
|
+
queryset = self.get_active_queryset(model_class).filter(id=pk)
|
|
84
|
+
else:
|
|
85
|
+
queryset = self.queryset.filter(id=pk)
|
|
86
|
+
if is_with_prefetch:
|
|
87
|
+
queryset = queryset.prefetch_related(*self.prefetch_related_fields.keys())
|
|
88
|
+
model = await queryset.first()
|
|
84
89
|
if model:
|
|
85
90
|
return model
|
|
86
91
|
else:
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
from typing import Optional, Type, Union, Any
|
|
2
2
|
|
|
3
|
+
from fastapi import Depends
|
|
4
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
3
5
|
from fastapi.types import DecoratedCallable
|
|
4
6
|
from pydantic import BaseModel
|
|
5
7
|
from starlette.requests import Request
|
|
@@ -73,10 +75,12 @@ class CreateView(BaseView, SaveMixin):
|
|
|
73
75
|
async def route(
|
|
74
76
|
request_data: self.create_schema, # type: ignore
|
|
75
77
|
request: Request,
|
|
78
|
+
token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
|
|
76
79
|
) -> JSONResponse:
|
|
77
80
|
data = await self.create(
|
|
78
81
|
request_data=request_data,
|
|
79
82
|
request=request,
|
|
83
|
+
token=token,
|
|
80
84
|
*args,
|
|
81
85
|
**kwargs
|
|
82
86
|
)
|
{fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/delete_filter_view.py
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from typing import Optional, Type, Any, Union
|
|
2
2
|
|
|
3
3
|
from fastapi import Query, Depends
|
|
4
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
4
5
|
from fastapi.types import DecoratedCallable
|
|
5
6
|
from starlette.requests import Request
|
|
6
7
|
from starlette.responses import JSONResponse
|
|
@@ -9,7 +10,7 @@ from tortoise.transactions import atomic
|
|
|
9
10
|
from fastgenerateapi.api_view.base_view import BaseView
|
|
10
11
|
from fastgenerateapi.data_type.data_type import CALLABLE, DEPENDENCIES
|
|
11
12
|
from fastgenerateapi.deps import filter_params_deps
|
|
12
|
-
from fastgenerateapi.schemas_factory import response_factory
|
|
13
|
+
from fastgenerateapi.schemas_factory import response_factory, get_one_schema_factory
|
|
13
14
|
from fastgenerateapi.settings.all_settings import settings
|
|
14
15
|
|
|
15
16
|
|
|
@@ -34,11 +35,13 @@ class DeleteFilterView(BaseView):
|
|
|
34
35
|
request: Request,
|
|
35
36
|
search: str = Query(default="", description="搜索"),
|
|
36
37
|
filters: dict = Depends(filter_params_deps(model_class=self.model_class, fields=self.filter_fields)),
|
|
38
|
+
token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
|
|
37
39
|
) -> JSONResponse:
|
|
38
40
|
await self.destroy_filter(
|
|
39
41
|
search=search,
|
|
40
42
|
filters=filters,
|
|
41
43
|
request=request,
|
|
44
|
+
token=token,
|
|
42
45
|
*args, **kwargs
|
|
43
46
|
)
|
|
44
47
|
return self.success(msg="删除成功")
|
|
@@ -47,8 +50,10 @@ class DeleteFilterView(BaseView):
|
|
|
47
50
|
def _handler_destroy_filter_settings(self):
|
|
48
51
|
if self.delete_filter_route:
|
|
49
52
|
return
|
|
53
|
+
if not hasattr(self, "get_one_schema"):
|
|
54
|
+
self.get_one_schema = get_one_schema_factory(model_class=self.model_class)
|
|
50
55
|
if not hasattr(self, "get_one_response_schema"):
|
|
51
|
-
self.get_one_response_schema = response_factory(
|
|
56
|
+
self.get_one_response_schema = response_factory(self.get_one_schema, name="GetOne")
|
|
52
57
|
doc = self.destroy_filter.__doc__
|
|
53
58
|
summary = doc.strip().split("\n")[0] if doc else "Delete Filter"
|
|
54
59
|
path = f"/{settings.app_settings.ROUTER_FILTER_DELETE_SUFFIX_FIELD}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
|
{fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/delete_tree_view.py
RENAMED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import time
|
|
2
2
|
from typing import Optional, Type, Any, Union
|
|
3
3
|
|
|
4
|
+
from fastapi import Depends
|
|
5
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
4
6
|
from fastapi.types import DecoratedCallable
|
|
5
7
|
from pydantic import BaseModel
|
|
6
8
|
from starlette.requests import Request
|
|
@@ -10,7 +12,7 @@ from tortoise.transactions import atomic
|
|
|
10
12
|
from fastgenerateapi.api_view.base_view import BaseView
|
|
11
13
|
from fastgenerateapi.data_type.data_type import CALLABLE, DEPENDENCIES
|
|
12
14
|
from fastgenerateapi.pydantic_utils.base_model import IdList
|
|
13
|
-
from fastgenerateapi.schemas_factory import response_factory
|
|
15
|
+
from fastgenerateapi.schemas_factory import response_factory, get_one_schema_factory
|
|
14
16
|
from fastgenerateapi.settings.all_settings import settings
|
|
15
17
|
|
|
16
18
|
|
|
@@ -61,10 +63,12 @@ class DeleteTreeView(BaseView):
|
|
|
61
63
|
async def route(
|
|
62
64
|
request_data: self.delete_tree_schema, # type: ignore
|
|
63
65
|
request: Request,
|
|
66
|
+
token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
|
|
64
67
|
) -> JSONResponse:
|
|
65
68
|
await self.destroy_tree(
|
|
66
69
|
request_data=request_data,
|
|
67
70
|
request=request,
|
|
71
|
+
token=token,
|
|
68
72
|
*args, **kwargs
|
|
69
73
|
)
|
|
70
74
|
return self.success(msg="删除成功")
|
|
@@ -73,8 +77,10 @@ class DeleteTreeView(BaseView):
|
|
|
73
77
|
def _handler_delete_tree_settings(self):
|
|
74
78
|
if self.delete_tree_route:
|
|
75
79
|
return
|
|
80
|
+
if not hasattr(self, "get_one_schema"):
|
|
81
|
+
self.get_one_schema = get_one_schema_factory(model_class=self.model_class)
|
|
76
82
|
if not hasattr(self, "get_one_response_schema"):
|
|
77
|
-
self.get_one_response_schema = response_factory(
|
|
83
|
+
self.get_one_response_schema = response_factory(self.get_one_schema, name="GetOne")
|
|
78
84
|
doc = self.destroy_tree.__doc__
|
|
79
85
|
summary = doc.strip().split("\n")[0] if doc else "Delete Tree"
|
|
80
86
|
path = f"/{settings.app_settings.ROUTER_RECURSION_DELETE_SUFFIX_FIELD}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import time
|
|
2
2
|
from typing import Optional, Type, Any, Union
|
|
3
3
|
|
|
4
|
+
from fastapi import Depends
|
|
5
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
4
6
|
from fastapi.types import DecoratedCallable
|
|
5
7
|
from pydantic import BaseModel
|
|
6
8
|
from starlette.requests import Request
|
|
@@ -10,7 +12,7 @@ from tortoise.transactions import atomic
|
|
|
10
12
|
from fastgenerateapi.api_view.base_view import BaseView
|
|
11
13
|
from fastgenerateapi.data_type.data_type import CALLABLE, DEPENDENCIES
|
|
12
14
|
from fastgenerateapi.pydantic_utils.base_model import IdList
|
|
13
|
-
from fastgenerateapi.schemas_factory import response_factory
|
|
15
|
+
from fastgenerateapi.schemas_factory import response_factory, get_one_schema_factory
|
|
14
16
|
from fastgenerateapi.settings.all_settings import settings
|
|
15
17
|
|
|
16
18
|
|
|
@@ -51,10 +53,12 @@ class DeleteView(BaseView):
|
|
|
51
53
|
async def route(
|
|
52
54
|
request_data: self.delete_schema, # type: ignore
|
|
53
55
|
request: Request,
|
|
56
|
+
token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
|
|
54
57
|
) -> JSONResponse:
|
|
55
58
|
await self.destroy(
|
|
56
59
|
request_data=request_data,
|
|
57
60
|
request=request,
|
|
61
|
+
token=token,
|
|
58
62
|
*args, **kwargs
|
|
59
63
|
)
|
|
60
64
|
return self.success(msg="删除成功")
|
|
@@ -63,8 +67,10 @@ class DeleteView(BaseView):
|
|
|
63
67
|
def _handler_delete_settings(self):
|
|
64
68
|
if not self.delete_route:
|
|
65
69
|
return
|
|
70
|
+
if not hasattr(self, "get_one_schema"):
|
|
71
|
+
self.get_one_schema = get_one_schema_factory(model_class=self.model_class)
|
|
66
72
|
if not hasattr(self, "get_one_response_schema"):
|
|
67
|
-
self.get_one_response_schema = response_factory(
|
|
73
|
+
self.get_one_response_schema = response_factory(self.get_one_schema, name="GetOne")
|
|
68
74
|
doc = self.destroy.__doc__
|
|
69
75
|
summary = doc.strip().split("\n")[0] if doc else "Delete All"
|
|
70
76
|
path = f"/{settings.app_settings.ROUTER_DELETE_SUFFIX_FIELD}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from typing import Union, Optional, Type, cast, List, Any, Callable, Coroutine
|
|
2
2
|
|
|
3
3
|
from fastapi import Depends, Query
|
|
4
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
4
5
|
from fastapi.types import DecoratedCallable
|
|
5
6
|
from fastapi_cache import JsonCoder
|
|
6
7
|
from fastapi_cache.decorator import cache
|
|
@@ -56,7 +57,7 @@ class GetAllView(BaseView, GetMixin):
|
|
|
56
57
|
处理search搜索;处理筛选字段;处理外键预加载;处理排序
|
|
57
58
|
"""
|
|
58
59
|
queryset = self.search_controller.query(queryset=self.queryset, value=search)
|
|
59
|
-
queryset = await self.filter_queryset(queryset, filters)
|
|
60
|
+
queryset = await self.filter_queryset(queryset, filters, *args, **kwargs)
|
|
60
61
|
queryset = self.filter_controller.query(queryset=queryset, values=filters)
|
|
61
62
|
queryset = queryset.prefetch_related(*self.prefetch_related_fields.keys())
|
|
62
63
|
if self.order_by_fields:
|
|
@@ -66,7 +67,7 @@ class GetAllView(BaseView, GetMixin):
|
|
|
66
67
|
|
|
67
68
|
return queryset
|
|
68
69
|
|
|
69
|
-
async def filter_queryset(self, queryset: QuerySet, filters: dict) -> QuerySet:
|
|
70
|
+
async def filter_queryset(self, queryset: QuerySet, filters: dict, *args, **kwargs) -> QuerySet:
|
|
70
71
|
"""
|
|
71
72
|
处理filters
|
|
72
73
|
example: value = filters.pop(value, None) queryset = queryset.filter(field=value+string)
|
|
@@ -84,6 +85,7 @@ class GetAllView(BaseView, GetMixin):
|
|
|
84
85
|
queryset: QuerySet,
|
|
85
86
|
paginator=None,
|
|
86
87
|
schema: Type[BaseModel] = None,
|
|
88
|
+
name: str = "", # 当使用fields时,需要输入名称用于自动生成schema
|
|
87
89
|
fields: List[Union[str, tuple]] = None,
|
|
88
90
|
*args, **kwargs
|
|
89
91
|
):
|
|
@@ -117,10 +119,10 @@ class GetAllView(BaseView, GetMixin):
|
|
|
117
119
|
if paginator is None or getattr(paginator, settings.app_settings.DETERMINE_WHETHER_PAGE_FIELD) == \
|
|
118
120
|
settings.app_settings.DETERMINE_PAGE_BOOL_VALUE:
|
|
119
121
|
if schema or fields:
|
|
120
|
-
return get_list_schema_factory()(**{settings.app_settings.LIST_RESPONSE_FIELD: data_list})
|
|
122
|
+
return get_list_schema_factory(schema, name)(**{settings.app_settings.LIST_RESPONSE_FIELD: data_list})
|
|
121
123
|
return self.get_list_schema(**{settings.app_settings.LIST_RESPONSE_FIELD: data_list})
|
|
122
124
|
if schema or fields:
|
|
123
|
-
return get_page_schema_factory()(**{
|
|
125
|
+
return get_page_schema_factory(schema, name)(**{
|
|
124
126
|
settings.app_settings.CURRENT_PAGE_FIELD: current_num,
|
|
125
127
|
settings.app_settings.PAGE_SIZE_FIELD: page_size,
|
|
126
128
|
settings.app_settings.TOTAL_SIZE_FIELD: count,
|
|
@@ -144,12 +146,14 @@ class GetAllView(BaseView, GetMixin):
|
|
|
144
146
|
paginator=Depends(paginator_deps()),
|
|
145
147
|
search: Optional[str] = Depends(search_params_deps(self.search_fields)),
|
|
146
148
|
filters: dict = Depends(filter_params_deps(model_class=self.model_class, fields=self.filter_fields, schema=self.filter_schema)),
|
|
149
|
+
token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
|
|
147
150
|
) -> JSONResponse:
|
|
148
151
|
data = await self.get_all(
|
|
149
152
|
paginator=paginator,
|
|
150
153
|
search=search,
|
|
151
154
|
filters=filters,
|
|
152
155
|
request=request,
|
|
156
|
+
token=token,
|
|
153
157
|
*args,
|
|
154
158
|
**kwargs
|
|
155
159
|
)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
from typing import Any, Union, Optional, Type
|
|
2
2
|
|
|
3
|
+
from fastapi import Depends
|
|
4
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
3
5
|
from fastapi.types import DecoratedCallable
|
|
4
6
|
from fastapi_cache import JsonCoder
|
|
5
7
|
from fastapi_cache.decorator import cache
|
|
@@ -22,6 +24,7 @@ class GetOneView(BaseView, GetMixin):
|
|
|
22
24
|
|
|
23
25
|
get_one_route: Union[bool, DEPENDENCIES] = True
|
|
24
26
|
get_one_schema: Optional[Type[BaseModel]] = None
|
|
27
|
+
is_with_prefetch: Optional[bool] = False
|
|
25
28
|
"""
|
|
26
29
|
get_one_route: 获取详情路由开关,可以放依赖函数列表
|
|
27
30
|
get_one_schema: 返回序列化
|
|
@@ -31,12 +34,13 @@ class GetOneView(BaseView, GetMixin):
|
|
|
31
34
|
- 优选模型层get_one_include和get_one_exclude(同时存在交集)
|
|
32
35
|
- 合并模型层include和exclude(同时存在交集)
|
|
33
36
|
- 模型层所有字段
|
|
37
|
+
is_with_prefetch: 是否带有列表的prefetch_related_fields
|
|
34
38
|
"""
|
|
35
39
|
|
|
36
40
|
async def get_one(self, pk: str, *args, **kwargs):
|
|
37
|
-
model = await self.get_object(pk)
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
model = await self.get_object(pk, is_with_prefetch=self.is_with_prefetch)
|
|
42
|
+
if self.is_with_prefetch:
|
|
43
|
+
await self.setattr_model(model, prefetch_related_fields=self.prefetch_related_fields, *args, **kwargs)
|
|
40
44
|
|
|
41
45
|
# await self.setattr_model_rpc(self.rpc_class, model, self.rpc_param)
|
|
42
46
|
model = await self.set_get_model(model)
|
|
@@ -48,10 +52,12 @@ class GetOneView(BaseView, GetMixin):
|
|
|
48
52
|
async def route(
|
|
49
53
|
pk: str,
|
|
50
54
|
request: Request,
|
|
55
|
+
token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
|
|
51
56
|
) -> JSONResponse:
|
|
52
57
|
data = await self.get_one(
|
|
53
58
|
pk=pk,
|
|
54
59
|
request=request,
|
|
60
|
+
token=token,
|
|
55
61
|
*args, **kwargs
|
|
56
62
|
)
|
|
57
63
|
return self.success(data=data)
|
{fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/get_relation_view.py
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from typing import Union, Optional, Type, cast, List, Any
|
|
2
2
|
|
|
3
3
|
from fastapi import Depends, Query
|
|
4
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
4
5
|
from fastapi.types import DecoratedCallable
|
|
5
6
|
from pydantic import BaseModel
|
|
6
7
|
from starlette.requests import Request
|
|
@@ -160,6 +161,7 @@ class GetRelationView(BaseView):
|
|
|
160
161
|
filters: dict = Depends(filter_params_deps(model_class=self.model_class, fields=self.filter_fields)),
|
|
161
162
|
relation_filters: dict = Depends(
|
|
162
163
|
filter_params_deps(model_class=self.relation_model_class, fields=self.relation_filter_fields)),
|
|
164
|
+
token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
|
|
163
165
|
) -> JSONResponse:
|
|
164
166
|
data = await self.get_relation(
|
|
165
167
|
pk=pk,
|
|
@@ -168,6 +170,7 @@ class GetRelationView(BaseView):
|
|
|
168
170
|
filters=filters,
|
|
169
171
|
relation_filters=relation_filters,
|
|
170
172
|
request=request,
|
|
173
|
+
token=token,
|
|
171
174
|
*args,
|
|
172
175
|
**kwargs
|
|
173
176
|
)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from typing import Union, Optional, Type, cast, List, Any, Callable, Coroutine
|
|
2
2
|
|
|
3
3
|
from fastapi import Depends, Query
|
|
4
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
4
5
|
from fastapi.types import DecoratedCallable
|
|
5
6
|
from fastapi_cache import JsonCoder
|
|
6
7
|
from fastapi_cache.decorator import cache
|
|
@@ -157,12 +158,14 @@ class GetTreeView(BaseView):
|
|
|
157
158
|
search: str = Query(default="", description="搜索"),
|
|
158
159
|
node_id: Optional[str] = Depends(tree_params_deps()),
|
|
159
160
|
filters: dict = Depends(filter_params_deps(model_class=self.model_class, fields=self.filter_fields)),
|
|
161
|
+
token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
|
|
160
162
|
) -> JSONResponse:
|
|
161
163
|
data = await self.get_tree(
|
|
162
164
|
search=search,
|
|
163
165
|
node_id=node_id,
|
|
164
166
|
filters=filters,
|
|
165
167
|
request=request,
|
|
168
|
+
token=token,
|
|
166
169
|
*args,
|
|
167
170
|
**kwargs
|
|
168
171
|
)
|
{fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/mixin/response_mixin.py
RENAMED
|
@@ -22,7 +22,7 @@ class ResponseMixin:
|
|
|
22
22
|
msg: str = "请求成功",
|
|
23
23
|
status_code: int = 200,
|
|
24
24
|
code: Optional[int] = None,
|
|
25
|
-
data:
|
|
25
|
+
data: Any = None,
|
|
26
26
|
background: Optional[BackgroundTask] = None,
|
|
27
27
|
*args,
|
|
28
28
|
**kwargs
|
|
@@ -37,7 +37,7 @@ class ResponseMixin:
|
|
|
37
37
|
"success": True,
|
|
38
38
|
"code": code,
|
|
39
39
|
settings.app_settings.MESSAGE_RESPONSE_FIELD: msg,
|
|
40
|
-
|
|
40
|
+
settings.app_settings.DATA_RESPONSE_FIELD: json_compatible_data
|
|
41
41
|
})
|
|
42
42
|
kwargs.update(resp.dict())
|
|
43
43
|
return JSONResponse(kwargs, status_code=status_code, background=background)
|
|
@@ -48,7 +48,7 @@ class ResponseMixin:
|
|
|
48
48
|
status_code: int = 200,
|
|
49
49
|
code: Optional[int] = None,
|
|
50
50
|
# success: bool = False,
|
|
51
|
-
data:
|
|
51
|
+
data: Any = None,
|
|
52
52
|
background: Optional[BackgroundTask] = None,
|
|
53
53
|
headers: Optional[Dict[str, Any]] = None,
|
|
54
54
|
*args,
|
|
@@ -65,7 +65,7 @@ class ResponseMixin:
|
|
|
65
65
|
"success": False,
|
|
66
66
|
"code": code,
|
|
67
67
|
settings.app_settings.MESSAGE_RESPONSE_FIELD: msg,
|
|
68
|
-
|
|
68
|
+
settings.app_settings.DATA_RESPONSE_FIELD: json_compatible_data
|
|
69
69
|
})
|
|
70
70
|
kwargs.update(resp.dict())
|
|
71
71
|
return JSONResponse(
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
from typing import List, Any
|
|
1
|
+
from typing import List, Any, Optional
|
|
2
2
|
|
|
3
|
+
from fastapi import Depends
|
|
4
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
3
5
|
from fastapi.types import DecoratedCallable
|
|
4
6
|
from starlette.requests import Request
|
|
5
7
|
from starlette.responses import JSONResponse
|
|
@@ -45,8 +47,12 @@ class SwitchView(BaseView):
|
|
|
45
47
|
return self.get_one_schema.from_orm(model)
|
|
46
48
|
|
|
47
49
|
def _switch_decorator(self, filed, *args: Any, **kwargs: Any) -> DecoratedCallable:
|
|
48
|
-
async def route(
|
|
49
|
-
|
|
50
|
+
async def route(
|
|
51
|
+
pk: str,
|
|
52
|
+
request: Request,
|
|
53
|
+
token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
|
|
54
|
+
) -> JSONResponse:
|
|
55
|
+
data = await self.switch(pk=pk, request=request, filed=filed, token=token, *args, **kwargs)
|
|
50
56
|
return self.success(data=data)
|
|
51
57
|
return route
|
|
52
58
|
|
{fastgenerateapi-1.1.7 → fastgenerateapi-1.1.9}/fastgenerateapi/api_view/update_relation_view.py
RENAMED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
from typing import Optional, Type, Union, Any
|
|
2
2
|
|
|
3
|
+
from fastapi import Depends
|
|
4
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
3
5
|
from fastapi.types import DecoratedCallable
|
|
4
6
|
from pydantic import BaseModel
|
|
5
7
|
from starlette.requests import Request
|
|
@@ -55,11 +57,13 @@ class UpdateRelationView(BaseView, SaveMixin):
|
|
|
55
57
|
pk: str,
|
|
56
58
|
request_data: self.update_relation_schema, # type: ignore
|
|
57
59
|
request: Request,
|
|
60
|
+
token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
|
|
58
61
|
) -> JSONResponse:
|
|
59
62
|
await self.update_relation(
|
|
60
63
|
pk=pk,
|
|
61
64
|
request_data=request_data,
|
|
62
65
|
request=request,
|
|
66
|
+
token=token,
|
|
63
67
|
*args, **kwargs
|
|
64
68
|
)
|
|
65
69
|
return self.success()
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
from typing import Optional, Type, Union, Any
|
|
2
2
|
|
|
3
|
+
from fastapi import Depends
|
|
4
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
3
5
|
from fastapi.types import DecoratedCallable
|
|
4
6
|
from starlette.requests import Request
|
|
5
7
|
from starlette.responses import JSONResponse
|
|
@@ -63,11 +65,13 @@ class UpdateView(BaseView, SaveMixin):
|
|
|
63
65
|
pk: str,
|
|
64
66
|
request_data: self.update_schema, # type: ignore
|
|
65
67
|
request: Request,
|
|
68
|
+
token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
|
|
66
69
|
) -> JSONResponse:
|
|
67
70
|
data = await self.update(
|
|
68
71
|
pk=pk,
|
|
69
72
|
request_data=request_data,
|
|
70
73
|
request=request,
|
|
74
|
+
token=token,
|
|
71
75
|
*args, **kwargs
|
|
72
76
|
)
|
|
73
77
|
return self.success(data=data)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from typing import Dict
|
|
2
|
+
|
|
3
|
+
from starlette.websockets import WebSocket
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ConnectionManager:
|
|
7
|
+
active_connections: Dict[str, WebSocket] = {}
|
|
8
|
+
active_group_connections: Dict[str, Dict[str, WebSocket]] = {}
|
|
9
|
+
|
|
10
|
+
@classmethod
|
|
11
|
+
def add_connection(cls, user_id: str, websocket: WebSocket):
|
|
12
|
+
cls.active_connections[user_id] = websocket
|
|
13
|
+
|
|
14
|
+
@classmethod
|
|
15
|
+
def del_connection(cls, user_id: str):
|
|
16
|
+
if user_id in cls.active_connections:
|
|
17
|
+
del cls.active_connections[user_id]
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def add_group_connection(cls, group_id: str, user_id: str, connection: WebSocket):
|
|
21
|
+
cls.active_group_connections.setdefault(group_id, {})[user_id] = connection
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def del_group_connection(cls, group_id: str, user_id: str):
|
|
25
|
+
if group_id in cls.active_group_connections:
|
|
26
|
+
user_dict = cls.active_group_connections[group_id]
|
|
27
|
+
if user_id in user_dict:
|
|
28
|
+
del user_dict[user_id]
|
|
29
|
+
if not user_dict:
|
|
30
|
+
del cls.active_group_connections[group_id]
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import _ctypes
|
|
2
1
|
from typing import List, Union
|
|
3
2
|
|
|
4
|
-
import
|
|
3
|
+
# from _ctypes import PyObj_FromPtr
|
|
5
4
|
from starlette.endpoints import WebSocketEndpoint
|
|
6
5
|
|
|
6
|
+
from fastgenerateapi.channel.connection_manager import ConnectionManager
|
|
7
|
+
|
|
7
8
|
|
|
8
9
|
class Consumer(WebSocketEndpoint):
|
|
9
10
|
"""
|
|
10
11
|
群聊
|
|
11
|
-
redis_conn: must
|
|
12
|
-
使用 aioredis
|
|
13
12
|
"""
|
|
14
|
-
redis_conn: aioredis.Redis
|
|
15
13
|
encoding = "json"
|
|
16
14
|
group_id = None
|
|
17
15
|
user_id = None
|
|
@@ -22,9 +20,13 @@ class Consumer(WebSocketEndpoint):
|
|
|
22
20
|
|
|
23
21
|
# 用户输入名称
|
|
24
22
|
self.group_id = websocket.path_params.get("group_id")
|
|
25
|
-
self.user_id =
|
|
23
|
+
self.user_id = await self.get_user_id(websocket)
|
|
26
24
|
await self.group_add(websocket, self.group_id, self.user_id)
|
|
27
|
-
await self.group_send(self.group_id, {"msg": f"{self.user_id}-加入了聊天室"})
|
|
25
|
+
# await self.group_send(self.group_id, {"msg": f"{self.user_id}-加入了聊天室"})
|
|
26
|
+
|
|
27
|
+
@staticmethod
|
|
28
|
+
async def get_user_id(websocket):
|
|
29
|
+
return websocket.query_params.get("user_id")
|
|
28
30
|
|
|
29
31
|
# 收消息后自动转发
|
|
30
32
|
async def on_receive(self, websocket, data):
|
|
@@ -34,18 +36,27 @@ class Consumer(WebSocketEndpoint):
|
|
|
34
36
|
# 断开 删除
|
|
35
37
|
async def on_disconnect(self, websocket, close_code):
|
|
36
38
|
if self.group_id and self.user_id:
|
|
37
|
-
await
|
|
39
|
+
await ConnectionManager.del_group_connection(self.group_id, self.user_id)
|
|
38
40
|
pass
|
|
39
41
|
|
|
42
|
+
async def check_args(self, group_id, user_id):
|
|
43
|
+
"""
|
|
44
|
+
用于检查数据是否有效
|
|
45
|
+
:param group_id:
|
|
46
|
+
:param user_id:
|
|
47
|
+
:return:
|
|
48
|
+
"""
|
|
49
|
+
return True
|
|
50
|
+
|
|
40
51
|
# 添加组
|
|
41
52
|
async def group_add(self, websocket, group_id, user_key):
|
|
42
|
-
if not self.redis_conn:
|
|
43
|
-
await self.error(websocket, code=500, msg="redis未设置")
|
|
44
53
|
if not group_id:
|
|
45
54
|
await self.error(websocket, code=422, msg="未获取到组信息")
|
|
46
55
|
if not user_key:
|
|
47
56
|
await self.error(websocket, code=422, msg="未获取到用户信息")
|
|
48
|
-
await self.
|
|
57
|
+
if not await self.check_args(group_id, user_key):
|
|
58
|
+
await self.error(websocket, code=422, msg="无连接权限")
|
|
59
|
+
await ConnectionManager.add_group_connection(group_id, user_key, websocket)
|
|
49
60
|
|
|
50
61
|
# 群发消息
|
|
51
62
|
@classmethod
|
|
@@ -59,17 +70,11 @@ class Consumer(WebSocketEndpoint):
|
|
|
59
70
|
:param exclude: 默认True排除自己;[int] 时可选排除其他人
|
|
60
71
|
:return:
|
|
61
72
|
"""
|
|
62
|
-
|
|
63
|
-
result = await cls.redis_conn.hgetall(group_id)
|
|
73
|
+
result = ConnectionManager.active_group_connections.get(group_id, {})
|
|
64
74
|
if type(exclude) == bool:
|
|
65
75
|
exclude = [user_id] if user_id and exclude else []
|
|
66
|
-
for
|
|
67
|
-
if
|
|
68
|
-
continue
|
|
69
|
-
try:
|
|
70
|
-
websocket = _ctypes.PyObj_FromPtr(int(value))
|
|
71
|
-
except Exception:
|
|
72
|
-
await cls.redis_conn.hdel(group_id, key)
|
|
76
|
+
for user_id, websocket in result.items():
|
|
77
|
+
if user_id in exclude:
|
|
73
78
|
continue
|
|
74
79
|
await websocket.send_json({
|
|
75
80
|
"code": code,
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
from typing import Union
|
|
2
|
+
|
|
3
|
+
from starlette.websockets import WebSocket
|
|
4
|
+
|
|
5
|
+
from fastgenerateapi.api_view.base_view import BaseView
|
|
6
|
+
from fastgenerateapi.channel.connection_manager import ConnectionManager
|
|
7
|
+
from fastgenerateapi.controller.ws_controller import WsController
|
|
8
|
+
from fastgenerateapi.data_type.data_type import DEPENDENCIES
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class WebsocketView(BaseView):
|
|
12
|
+
"""
|
|
13
|
+
客户端与服务器之间通信
|
|
14
|
+
"""
|
|
15
|
+
websocket_route: Union[bool, DEPENDENCIES] = True
|
|
16
|
+
|
|
17
|
+
def _handler_websocket_settings(self):
|
|
18
|
+
self.ws_summary = WsController(self, self._get_cls_ws_func())
|
|
19
|
+
for ws_router in self.ws_summary.ws_router_data:
|
|
20
|
+
self._add_api_websocket_route(
|
|
21
|
+
f"/{ws_router.path}",
|
|
22
|
+
getattr(self, ws_router.func_name),
|
|
23
|
+
dependencies=ws_router.dependencies,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
async def accept(cls, user_id:str, websocket: WebSocket):
|
|
28
|
+
await websocket.accept()
|
|
29
|
+
ConnectionManager.add_connection(user_id=user_id, websocket=websocket)
|
|
30
|
+
|
|
31
|
+
return websocket
|
|
32
|
+
|
|
33
|
+
@classmethod
|
|
34
|
+
async def send(cls, user_id, data, code=200):
|
|
35
|
+
"""
|
|
36
|
+
群发送消息
|
|
37
|
+
:param user_id: 用户id
|
|
38
|
+
:param data: 发送的数据
|
|
39
|
+
:param code: 状态码
|
|
40
|
+
:return:
|
|
41
|
+
"""
|
|
42
|
+
if not user_id or not data:
|
|
43
|
+
return False
|
|
44
|
+
|
|
45
|
+
websocket = ConnectionManager.active_connections.get(user_id)
|
|
46
|
+
if not websocket:
|
|
47
|
+
return False
|
|
48
|
+
await websocket.send_json({
|
|
49
|
+
"code": code,
|
|
50
|
+
"from": user_id,
|
|
51
|
+
# "message": "请求成功",
|
|
52
|
+
"data": data
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
return True
|
|
56
|
+
|
|
57
|
+
@classmethod
|
|
58
|
+
async def group_send(cls, user_id_list, data, code=200):
|
|
59
|
+
"""
|
|
60
|
+
群发送消息
|
|
61
|
+
:param user_id_list: 用户id列表
|
|
62
|
+
:param data: 发送的数据
|
|
63
|
+
:param code: 状态码
|
|
64
|
+
:return:
|
|
65
|
+
"""
|
|
66
|
+
if not user_id_list or not data:
|
|
67
|
+
return [], user_id_list
|
|
68
|
+
success_user_id_list = []
|
|
69
|
+
fail_user_id_list = []
|
|
70
|
+
for user_id in user_id_list:
|
|
71
|
+
websocket = ConnectionManager.active_connections.get(user_id)
|
|
72
|
+
if not websocket:
|
|
73
|
+
fail_user_id_list.append(user_id)
|
|
74
|
+
continue
|
|
75
|
+
await websocket.send_json({
|
|
76
|
+
"code": code,
|
|
77
|
+
"from": user_id,
|
|
78
|
+
# "message": "请求成功",
|
|
79
|
+
"data": data
|
|
80
|
+
})
|
|
81
|
+
success_user_id_list.append(user_id)
|
|
82
|
+
|
|
83
|
+
return success_user_id_list, fail_user_id_list
|