reyserver 1.1.43__py3-none-any.whl → 1.1.45__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.
- reyserver/__init__.py +3 -0
- reyserver/rbase.py +31 -32
- reyserver/rclient.py +59 -2
- reyserver/rfile.py +173 -226
- reyserver/rserver.py +38 -20
- {reyserver-1.1.43.dist-info → reyserver-1.1.45.dist-info}/METADATA +1 -1
- reyserver-1.1.45.dist-info/RECORD +10 -0
- reyserver-1.1.43.dist-info/RECORD +0 -10
- {reyserver-1.1.43.dist-info → reyserver-1.1.45.dist-info}/WHEEL +0 -0
- {reyserver-1.1.43.dist-info → reyserver-1.1.45.dist-info}/licenses/LICENSE +0 -0
reyserver/__init__.py
CHANGED
reyserver/rbase.py
CHANGED
@@ -12,18 +12,17 @@
|
|
12
12
|
from typing import Sequence
|
13
13
|
from inspect import iscoroutinefunction
|
14
14
|
from contextlib import asynccontextmanager
|
15
|
-
from fastapi import FastAPI
|
15
|
+
from fastapi import FastAPI
|
16
|
+
from reykit.rbase import CoroutineFunctionSimple, Base, ConfigMeta
|
16
17
|
|
17
|
-
from
|
18
|
-
from reydb.rconn import DatabaseConnectionAsync
|
19
|
-
from reydb.rorm import DatabaseORMSessionAsync
|
20
|
-
from reykit.rbase import CoroutineFunctionSimple, Base, is_iterable
|
18
|
+
from . import rserver
|
21
19
|
|
22
20
|
|
23
21
|
__all__ = (
|
24
22
|
'ServerBase',
|
25
|
-
'
|
26
|
-
'create_lifespan'
|
23
|
+
'ServerConfig',
|
24
|
+
'create_lifespan',
|
25
|
+
'create_depend_sess'
|
27
26
|
)
|
28
27
|
|
29
28
|
|
@@ -33,11 +32,14 @@ class ServerBase(Base):
|
|
33
32
|
"""
|
34
33
|
|
35
34
|
|
36
|
-
class
|
35
|
+
class ServerConfig(ServerBase, metaclass=ConfigMeta):
|
37
36
|
"""
|
38
|
-
|
37
|
+
Config type.
|
39
38
|
"""
|
40
39
|
|
40
|
+
server: 'rserver.Server'
|
41
|
+
'Server instance.'
|
42
|
+
|
41
43
|
|
42
44
|
def create_lifespan(
|
43
45
|
before: CoroutineFunctionSimple | Sequence[CoroutineFunctionSimple] | None = None,
|
@@ -86,34 +88,31 @@ def create_lifespan(
|
|
86
88
|
return lifespan
|
87
89
|
|
88
90
|
|
89
|
-
|
90
|
-
|
91
|
-
|
91
|
+
def create_depend_sess(database: str):
|
92
|
+
"""
|
93
|
+
Create dependencie function of asynchronous database session.
|
92
94
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
# """
|
95
|
+
Parameters
|
96
|
+
----------
|
97
|
+
database : Database name.
|
97
98
|
|
99
|
+
Returns
|
100
|
+
-------
|
101
|
+
Dependencie function.
|
102
|
+
"""
|
98
103
|
|
99
|
-
# @asynccontextmanager
|
100
|
-
# async def lifespan(app: FastAPI):
|
101
|
-
# """
|
102
|
-
# Server lifespan manager.
|
103
104
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
105
|
+
async def depend_sess():
|
106
|
+
"""
|
107
|
+
Dependencie function of asynchronous database session.
|
108
|
+
"""
|
108
109
|
|
109
|
-
#
|
110
|
-
|
111
|
-
# await task()
|
112
|
-
# yield
|
110
|
+
# Parameter.
|
111
|
+
engine = ServerConfig.server.db[database]
|
113
112
|
|
114
|
-
#
|
115
|
-
|
116
|
-
|
113
|
+
# Context.
|
114
|
+
async with engine.orm.session() as sess:
|
115
|
+
yield sess
|
117
116
|
|
118
117
|
|
119
|
-
|
118
|
+
return depend_sess
|
reyserver/rclient.py
CHANGED
@@ -9,7 +9,10 @@
|
|
9
9
|
"""
|
10
10
|
|
11
11
|
|
12
|
-
from
|
12
|
+
from reykit.ros import File, get_md5
|
13
|
+
from reykit.rnet import join_url, request
|
14
|
+
|
15
|
+
from .rbase import ServerBase
|
13
16
|
|
14
17
|
|
15
18
|
__all__ = (
|
@@ -36,7 +39,61 @@ class ServerClient(ServerBase):
|
|
36
39
|
self.url = url
|
37
40
|
|
38
41
|
|
39
|
-
def upload_file(
|
42
|
+
def upload_file(
|
43
|
+
self,
|
44
|
+
source: str | bytes,
|
45
|
+
name: str | None = None,
|
46
|
+
note: str | None = None
|
47
|
+
) -> int:
|
48
|
+
"""
|
49
|
+
Upload file.
|
50
|
+
|
51
|
+
Parameters
|
52
|
+
----------
|
53
|
+
source : File path or file bytes.
|
54
|
+
name : File name.
|
55
|
+
- `None`: Automatic set.
|
56
|
+
`parameter 'file' is 'str'`: Use path file name.
|
57
|
+
`parameter 'file' is 'bytes'`: No name.
|
58
|
+
- `str`: Use this name.
|
59
|
+
note : File note.
|
60
|
+
|
61
|
+
Returns
|
62
|
+
-------
|
63
|
+
File ID.
|
64
|
+
"""
|
65
|
+
|
66
|
+
# Handle parameter.
|
67
|
+
url = join_url(self.url, 'file', 'upload')
|
68
|
+
match source:
|
69
|
+
|
70
|
+
## File path.
|
71
|
+
case str():
|
72
|
+
file = File(source)
|
73
|
+
file_bytes = file.bytes
|
74
|
+
file_name = file.name_suffix
|
75
|
+
|
76
|
+
## File bytes.
|
77
|
+
case bytes() | bytearray():
|
78
|
+
if type(source) == bytearray:
|
79
|
+
source = bytes(source)
|
80
|
+
file_bytes = source
|
81
|
+
file_name = None
|
82
|
+
|
83
|
+
## File name.
|
84
|
+
if name is not None:
|
85
|
+
file_name = name
|
86
|
+
|
87
|
+
# Upload.
|
88
|
+
data = {'name': file_name, 'note': note}
|
89
|
+
files = {'file': file_bytes}
|
90
|
+
response = request(url, data=data, files=files, check=True)
|
91
|
+
|
92
|
+
## Extract.
|
93
|
+
response_json = response.json()
|
94
|
+
file_id = response_json['file_id']
|
95
|
+
|
96
|
+
return file_id
|
40
97
|
|
41
98
|
|
42
99
|
def download_file(self): ...
|
reyserver/rfile.py
CHANGED
@@ -11,16 +11,16 @@
|
|
11
11
|
|
12
12
|
from typing import Annotated
|
13
13
|
from fastapi import APIRouter, Form, File, UploadFile, Depends
|
14
|
-
from reydb import rorm
|
14
|
+
from reydb import rorm
|
15
15
|
from reykit.ros import FileStore, get_md5
|
16
16
|
|
17
|
-
from .rbase import
|
17
|
+
from .rbase import ServerConfig, create_depend_sess
|
18
18
|
|
19
19
|
|
20
20
|
__all__ = (
|
21
21
|
'DatabaseORMTableInfo',
|
22
22
|
'DatabaseORMTableData',
|
23
|
-
'
|
23
|
+
'build_file_db'
|
24
24
|
)
|
25
25
|
|
26
26
|
|
@@ -50,232 +50,179 @@ class DatabaseORMTableData(rorm.Model, table=True):
|
|
50
50
|
path: str = rorm.Field(rorm.types.VARCHAR(4095), not_null=True, comment='File disk storage path.')
|
51
51
|
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
Server File API type.
|
56
|
-
Can create database used `self.build_db` method.
|
57
|
-
"""
|
58
|
-
|
59
|
-
|
60
|
-
def __init__(
|
61
|
-
self,
|
62
|
-
db_engine: DatabaseEngineAsync,
|
63
|
-
path: str = 'file'
|
64
|
-
) -> None:
|
65
|
-
"""
|
66
|
-
Build instance attributes.
|
67
|
-
|
68
|
-
Parameters
|
69
|
-
----------
|
70
|
-
db_engine : Asynchronous database instance.
|
71
|
-
path: File store directory.
|
72
|
-
"""
|
73
|
-
|
74
|
-
# Build.
|
75
|
-
self.db_engine = db_engine
|
76
|
-
self.path = path
|
77
|
-
|
78
|
-
## Router.
|
79
|
-
self.router = self.__create_router()
|
80
|
-
|
81
|
-
## Build Database.
|
82
|
-
self.build_db()
|
83
|
-
|
84
|
-
|
85
|
-
async def depend_sess(self):
|
86
|
-
"""
|
87
|
-
Dependencie function of asynchronous database session.
|
88
|
-
"""
|
89
|
-
|
90
|
-
# Context.
|
91
|
-
async with self.db_engine.orm.session() as sess:
|
92
|
-
yield sess
|
93
|
-
|
94
|
-
|
95
|
-
def __create_router(self) -> APIRouter:
|
96
|
-
"""
|
97
|
-
Add APIs to router.
|
98
|
-
|
99
|
-
Returns
|
100
|
-
-------
|
101
|
-
Router.
|
102
|
-
"""
|
103
|
-
|
104
|
-
# Parameter.
|
105
|
-
router = APIRouter()
|
106
|
-
|
53
|
+
file_router = APIRouter()
|
54
|
+
depend_sess_file = create_depend_sess('file')
|
107
55
|
|
108
|
-
@router.post('/upload')
|
109
|
-
async def upload(
|
110
|
-
file: Annotated[UploadFile, File()],
|
111
|
-
note: Annotated[str, Form()],
|
112
|
-
sess: Annotated[rorm.DatabaseORMSessionAsync, Depends(self.depend_sess)]
|
113
|
-
):
|
114
|
-
"""
|
115
|
-
Upload file.
|
116
56
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
file_name = file.filename
|
127
|
-
file_bytes = await file.read()
|
128
|
-
file_md5 = get_md5(file_bytes)
|
129
|
-
file_size = len(file_bytes)
|
57
|
+
@file_router.post('/upload')
|
58
|
+
async def upload(
|
59
|
+
file: Annotated[UploadFile, File()],
|
60
|
+
name: Annotated[str, Form()],
|
61
|
+
note: Annotated[str, Form()],
|
62
|
+
sess: Annotated[rorm.DatabaseORMSessionAsync, Depends(depend_sess_file)]
|
63
|
+
):
|
64
|
+
"""
|
65
|
+
Upload file.
|
130
66
|
|
131
|
-
|
132
|
-
|
67
|
+
Parameters
|
68
|
+
----------
|
69
|
+
file : File instance.
|
70
|
+
note : File note.
|
71
|
+
sess : Asynchronous database session.
|
72
|
+
"""
|
133
73
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
74
|
+
# Handle parameter.
|
75
|
+
file_store = FileStore(ServerConfig.server.api_file_dir)
|
76
|
+
file_bytes = await file.read()
|
77
|
+
file_md5 = get_md5(file_bytes)
|
78
|
+
file_size = len(file_bytes)
|
79
|
+
|
80
|
+
# Upload.
|
81
|
+
file_path = file_store.index(file_md5)
|
82
|
+
|
83
|
+
## Data.
|
84
|
+
if file_path is None:
|
85
|
+
file_path = file_store.store(file_bytes)
|
86
|
+
table_data = DatabaseORMTableData(
|
87
|
+
md5=file_md5,
|
88
|
+
size=file_size,
|
89
|
+
path=file_path
|
90
|
+
)
|
91
|
+
await sess.add(table_data)
|
92
|
+
|
93
|
+
## Information.
|
94
|
+
table_info = DatabaseORMTableInfo(
|
95
|
+
md5=file_md5,
|
96
|
+
name=name,
|
97
|
+
note=note
|
98
|
+
)
|
99
|
+
await sess.add(table_info)
|
100
|
+
|
101
|
+
# Get ID.
|
102
|
+
await sess.flush()
|
103
|
+
file_id = table_info.file_id
|
104
|
+
|
105
|
+
return {'file_id': file_id}
|
106
|
+
|
107
|
+
|
108
|
+
def build_file_db() -> None:
|
109
|
+
"""
|
110
|
+
Check and build `file` database tables.
|
111
|
+
"""
|
143
112
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
113
|
+
# Set parameter.
|
114
|
+
engine = ServerConfig.server.db.file
|
115
|
+
database = engine.database
|
116
|
+
|
117
|
+
## Table.
|
118
|
+
tables = [DatabaseORMTableInfo, DatabaseORMTableData]
|
119
|
+
|
120
|
+
## View.
|
121
|
+
views = [
|
122
|
+
{
|
123
|
+
'path': 'data_info',
|
124
|
+
'select': (
|
125
|
+
'SELECT `b`.`last_time`, `a`.`md5`, `a`.`size`, `b`.`names`, `b`.`notes`\n'
|
126
|
+
f'FROM `{database}`.`data` AS `a`\n'
|
127
|
+
'LEFT JOIN (\n'
|
128
|
+
' SELECT\n'
|
129
|
+
' `md5`,\n'
|
130
|
+
" GROUP_CONCAT(DISTINCT(`name`) ORDER BY `create_time` DESC SEPARATOR ' | ') AS `names`,\n"
|
131
|
+
" GROUP_CONCAT(DISTINCT(`note`) ORDER BY `create_time` DESC SEPARATOR ' | ') AS `notes`,\n"
|
132
|
+
' MAX(`create_time`) as `last_time`\n'
|
133
|
+
f' FROM `{database}`.`info`\n'
|
134
|
+
' GROUP BY `md5`\n'
|
135
|
+
' ORDER BY `last_time` DESC\n'
|
136
|
+
') AS `b`\n'
|
137
|
+
'ON `a`.`md5` = `b`.`md5`\n'
|
138
|
+
'ORDER BY `last_time` DESC'
|
149
139
|
)
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
'
|
183
|
-
|
184
|
-
|
185
|
-
'
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
'
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
'
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
'
|
229
|
-
'
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
'SELECT COUNT(1)\n'
|
240
|
-
f'FROM `{database}`.`data`'
|
241
|
-
),
|
242
|
-
'comment': 'File data unique count.'
|
243
|
-
},
|
244
|
-
{
|
245
|
-
'name': 'total_size',
|
246
|
-
'select': (
|
247
|
-
'SELECT FORMAT(SUM(`size`), 0)\n'
|
248
|
-
f'FROM `{database}`.`data`'
|
249
|
-
),
|
250
|
-
'comment': 'File total byte size.'
|
251
|
-
},
|
252
|
-
{
|
253
|
-
'name': 'avg_size',
|
254
|
-
'select': (
|
255
|
-
'SELECT FORMAT(AVG(`size`), 0)\n'
|
256
|
-
f'FROM `{database}`.`data`'
|
257
|
-
),
|
258
|
-
'comment': 'File average byte size.'
|
259
|
-
},
|
260
|
-
{
|
261
|
-
'name': 'max_size',
|
262
|
-
'select': (
|
263
|
-
'SELECT FORMAT(MAX(`size`), 0)\n'
|
264
|
-
f'FROM `{database}`.`data`'
|
265
|
-
),
|
266
|
-
'comment': 'File maximum byte size.'
|
267
|
-
},
|
268
|
-
{
|
269
|
-
'name': 'last_time',
|
270
|
-
'select': (
|
271
|
-
'SELECT MAX(`create_time`)\n'
|
272
|
-
f'FROM `{database}`.`info`'
|
273
|
-
),
|
274
|
-
'comment': 'File last record create time.'
|
275
|
-
}
|
276
|
-
]
|
277
|
-
}
|
278
|
-
]
|
279
|
-
|
280
|
-
# Build.
|
281
|
-
self.db_engine.sync_database.build.build(tables=tables, views=views, views_stats=views_stats, skip=True)
|
140
|
+
}
|
141
|
+
]
|
142
|
+
|
143
|
+
## View stats.
|
144
|
+
views_stats = [
|
145
|
+
{
|
146
|
+
'path': 'stats',
|
147
|
+
'items': [
|
148
|
+
{
|
149
|
+
'name': 'count',
|
150
|
+
'select': (
|
151
|
+
'SELECT COUNT(1)\n'
|
152
|
+
f'FROM `{database}`.`info`'
|
153
|
+
),
|
154
|
+
'comment': 'File information count.'
|
155
|
+
},
|
156
|
+
{
|
157
|
+
'name': 'past_day_count',
|
158
|
+
'select': (
|
159
|
+
'SELECT COUNT(1)\n'
|
160
|
+
f'FROM `{database}`.`info`\n'
|
161
|
+
'WHERE TIMESTAMPDIFF(DAY, `create_time`, NOW()) = 0'
|
162
|
+
),
|
163
|
+
'comment': 'File information count in the past day.'
|
164
|
+
},
|
165
|
+
{
|
166
|
+
'name': 'past_week_count',
|
167
|
+
'select': (
|
168
|
+
'SELECT COUNT(1)\n'
|
169
|
+
f'FROM `{database}`.`info`\n'
|
170
|
+
'WHERE TIMESTAMPDIFF(DAY, `create_time`, NOW()) <= 6'
|
171
|
+
),
|
172
|
+
'comment': 'File information count in the past week.'
|
173
|
+
},
|
174
|
+
{
|
175
|
+
'name': 'past_month_count',
|
176
|
+
'select': (
|
177
|
+
'SELECT COUNT(1)\n'
|
178
|
+
f'FROM `{database}`.`info`\n'
|
179
|
+
'WHERE TIMESTAMPDIFF(DAY, `create_time`, NOW()) <= 29'
|
180
|
+
),
|
181
|
+
'comment': 'File information count in the past month.'
|
182
|
+
},
|
183
|
+
{
|
184
|
+
'name': 'data_count',
|
185
|
+
'select': (
|
186
|
+
'SELECT COUNT(1)\n'
|
187
|
+
f'FROM `{database}`.`data`'
|
188
|
+
),
|
189
|
+
'comment': 'File data unique count.'
|
190
|
+
},
|
191
|
+
{
|
192
|
+
'name': 'total_size',
|
193
|
+
'select': (
|
194
|
+
'SELECT FORMAT(SUM(`size`), 0)\n'
|
195
|
+
f'FROM `{database}`.`data`'
|
196
|
+
),
|
197
|
+
'comment': 'File total byte size.'
|
198
|
+
},
|
199
|
+
{
|
200
|
+
'name': 'avg_size',
|
201
|
+
'select': (
|
202
|
+
'SELECT FORMAT(AVG(`size`), 0)\n'
|
203
|
+
f'FROM `{database}`.`data`'
|
204
|
+
),
|
205
|
+
'comment': 'File average byte size.'
|
206
|
+
},
|
207
|
+
{
|
208
|
+
'name': 'max_size',
|
209
|
+
'select': (
|
210
|
+
'SELECT FORMAT(MAX(`size`), 0)\n'
|
211
|
+
f'FROM `{database}`.`data`'
|
212
|
+
),
|
213
|
+
'comment': 'File maximum byte size.'
|
214
|
+
},
|
215
|
+
{
|
216
|
+
'name': 'last_time',
|
217
|
+
'select': (
|
218
|
+
'SELECT MAX(`create_time`)\n'
|
219
|
+
f'FROM `{database}`.`info`'
|
220
|
+
),
|
221
|
+
'comment': 'File last record create time.'
|
222
|
+
}
|
223
|
+
]
|
224
|
+
}
|
225
|
+
]
|
226
|
+
|
227
|
+
# Build.
|
228
|
+
engine.sync_engine.build.build(tables=tables, views=views, views_stats=views_stats, skip=True)
|
reyserver/rserver.py
CHANGED
@@ -9,18 +9,15 @@
|
|
9
9
|
"""
|
10
10
|
|
11
11
|
|
12
|
-
from
|
12
|
+
from collections.abc import Sequence
|
13
13
|
from inspect import iscoroutinefunction
|
14
|
-
from
|
14
|
+
from uvicorn import run as uvicorn_run
|
15
15
|
from fastapi import FastAPI, Depends
|
16
|
-
from fastapi.middleware.gzip import GZipMiddleware
|
17
16
|
from fastapi.staticfiles import StaticFiles
|
18
|
-
from
|
19
|
-
from
|
20
|
-
from reykit.rbase import CoroutineFunctionSimple
|
17
|
+
from reydb import DatabaseAsync
|
18
|
+
from reykit.rbase import CoroutineFunctionSimple, Singleton, throw
|
21
19
|
|
22
|
-
from .rbase import ServerBase, create_lifespan
|
23
|
-
from .rfile import ServerAPIFile
|
20
|
+
from .rbase import ServerBase, ServerConfig, create_lifespan
|
24
21
|
|
25
22
|
|
26
23
|
__all__ = (
|
@@ -28,15 +25,17 @@ __all__ = (
|
|
28
25
|
)
|
29
26
|
|
30
27
|
|
31
|
-
class Server(ServerBase):
|
28
|
+
class Server(ServerBase, Singleton):
|
32
29
|
"""
|
33
|
-
Server type.
|
30
|
+
Server type, singleton mode.
|
34
31
|
Based on `fastapi` and `uvicorn` package.
|
32
|
+
Can view document api '/docs', '/redoc', '/openapi.json'.
|
35
33
|
"""
|
36
34
|
|
37
35
|
|
38
36
|
def __init__(
|
39
37
|
self,
|
38
|
+
db: DatabaseAsync,
|
40
39
|
public: str | None = None,
|
41
40
|
depend: CoroutineFunctionSimple | Sequence[CoroutineFunctionSimple] | None = None,
|
42
41
|
before: CoroutineFunctionSimple | Sequence[CoroutineFunctionSimple] | None = None,
|
@@ -49,15 +48,18 @@ class Server(ServerBase):
|
|
49
48
|
|
50
49
|
Parameters
|
51
50
|
----------
|
51
|
+
db : Asynchronous database.
|
52
52
|
public : Public directory.
|
53
53
|
depend : Global api dependencies.
|
54
54
|
before : Execute before server start.
|
55
55
|
after : Execute after server end.
|
56
|
+
ssl_cert : SSL certificate file path.
|
57
|
+
ssl_key : SSL key file path.
|
56
58
|
"""
|
57
59
|
|
58
60
|
# Parameter.
|
59
61
|
if type(ssl_cert) != type(ssl_key):
|
60
|
-
|
62
|
+
throw(AssertionError, ssl_cert, ssl_key)
|
61
63
|
lifespan = create_lifespan(before, after)
|
62
64
|
if depend is None:
|
63
65
|
depend = ()
|
@@ -69,6 +71,8 @@ class Server(ServerBase):
|
|
69
71
|
]
|
70
72
|
|
71
73
|
# Build.
|
74
|
+
ServerConfig.server = self
|
75
|
+
self.db = db
|
72
76
|
self.ssl_cert = ssl_cert
|
73
77
|
self.ssl_key = ssl_key
|
74
78
|
|
@@ -76,7 +80,7 @@ class Server(ServerBase):
|
|
76
80
|
self.app = FastAPI(
|
77
81
|
dependencies=depend,
|
78
82
|
lifespan=lifespan,
|
79
|
-
debug=True
|
83
|
+
# debug=True
|
80
84
|
)
|
81
85
|
|
82
86
|
## Static.
|
@@ -84,15 +88,15 @@ class Server(ServerBase):
|
|
84
88
|
subapp = StaticFiles(directory=public, html=True)
|
85
89
|
self.app.mount('/', subapp)
|
86
90
|
|
87
|
-
##
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
+
## API.
|
92
|
+
|
93
|
+
### File.
|
94
|
+
self.api_file_dir: str
|
91
95
|
|
92
96
|
|
93
97
|
def run(self) -> None:
|
94
98
|
"""
|
95
|
-
Run.
|
99
|
+
Run server.
|
96
100
|
"""
|
97
101
|
|
98
102
|
# Run.
|
@@ -110,7 +114,21 @@ class Server(ServerBase):
|
|
110
114
|
return {'message': 'test'}
|
111
115
|
|
112
116
|
|
113
|
-
def add_api_file(self,
|
117
|
+
def add_api_file(self, file_dir: str = 'file') -> None:
|
118
|
+
"""
|
119
|
+
Add file API.
|
120
|
+
|
121
|
+
Parameters
|
122
|
+
----------
|
123
|
+
file_dir : File API store directory path.
|
124
|
+
prefix : File API path prefix.
|
125
|
+
"""
|
126
|
+
|
127
|
+
from .rfile import file_router, build_file_db
|
128
|
+
|
129
|
+
# Build database.
|
130
|
+
build_file_db()
|
114
131
|
|
115
|
-
|
116
|
-
self.
|
132
|
+
# Add.
|
133
|
+
self.api_file_dir = file_dir
|
134
|
+
self.app.include_router(file_router, prefix='/file')
|
@@ -0,0 +1,10 @@
|
|
1
|
+
reyserver/__init__.py,sha256=JmDkcdP7oxmehE53rRRL_zhxmPinAbJRONpQp5qhsGI,340
|
2
|
+
reyserver/rall.py,sha256=6vqacf9erEfVfK5sgGJMDXD1h4ebt5gDN7NrPdtELms,248
|
3
|
+
reyserver/rbase.py,sha256=khBk6N0G33hstiisDWtz4Tdg1tvnFrGszOynBtnKxsI,2305
|
4
|
+
reyserver/rclient.py,sha256=OjY_OEH_USrJK8TuCevXG6jNPVbM0lN-xMBozB7kSM8,2195
|
5
|
+
reyserver/rfile.py,sha256=wf56tItty7Jbjcwvh1yMgcX2jlSSXAYbTDKnA5dI8Yw,7459
|
6
|
+
reyserver/rserver.py,sha256=SfGs0W6StFtRtJ_UYI_avlL99euw7VvP55248mSOjLw,3387
|
7
|
+
reyserver-1.1.45.dist-info/METADATA,sha256=N4nGN_EC1Czdd7Q5DIHr4mxM3NNiPQCgjDenIZJ25yg,1658
|
8
|
+
reyserver-1.1.45.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
9
|
+
reyserver-1.1.45.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
|
10
|
+
reyserver-1.1.45.dist-info/RECORD,,
|
@@ -1,10 +0,0 @@
|
|
1
|
-
reyserver/__init__.py,sha256=pkrC_rbWwOScD1laT_5d_5qz1QZeLLu-qBqgWPqtvjI,307
|
2
|
-
reyserver/rall.py,sha256=6vqacf9erEfVfK5sgGJMDXD1h4ebt5gDN7NrPdtELms,248
|
3
|
-
reyserver/rbase.py,sha256=DYIQDlV7VOJHXgOExKP-I726nVoFSMWYDbf7UJWCMBQ,2402
|
4
|
-
reyserver/rclient.py,sha256=QICmY52XSFTf16G-z0IsiO1jsXXWKIOdhpufYbfxkO0,641
|
5
|
-
reyserver/rfile.py,sha256=8KOJcCBjNjgfma1Q_tTyWI6wGLUcfGlo1DkqTv2mZBE,9244
|
6
|
-
reyserver/rserver.py,sha256=M9pNnZy6tENu8B0hphcsMA0nHI8lHlR6gKbZ6YAfYrM,2939
|
7
|
-
reyserver-1.1.43.dist-info/METADATA,sha256=XjtSDclS4UBbXh55dn--OWtnQsg6ECH0HcI0JPyi2Ig,1658
|
8
|
-
reyserver-1.1.43.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
9
|
-
reyserver-1.1.43.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
|
10
|
-
reyserver-1.1.43.dist-info/RECORD,,
|
File without changes
|
File without changes
|