reyserver 1.1.65__py3-none-any.whl → 1.1.67__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.

Potentially problematic release.


This version of reyserver might be problematic. Click here for more details.

reyserver/rauth.py CHANGED
@@ -407,7 +407,7 @@ async def get_user_data(
407
407
 
408
408
 
409
409
  @router_auth.post('/token')
410
- async def create_sessions(
410
+ async def create_token(
411
411
  username: str = Bind.i.form,
412
412
  password: str = Bind.i.form,
413
413
  conn: Bind.Conn = Bind.conn.auth,
reyserver/rbase.py CHANGED
@@ -11,8 +11,8 @@
11
11
 
12
12
  from typing import Literal, Type, NoReturn, overload
13
13
  from http import HTTPStatus
14
- from fastapi import APIRouter
15
- from fastapi import HTTPException, Request, UploadFile as File
14
+ from fastapi import FastAPI, APIRouter, Request, UploadFile as File, HTTPException
15
+ from fastapi.responses import HTMLResponse, FileResponse
16
16
  from fastapi.params import (
17
17
  Depends,
18
18
  Path,
@@ -26,6 +26,7 @@ from fastapi.params import (
26
26
  from reydb.rconn import DatabaseConnectionAsync
27
27
  from reydb.rorm import DatabaseORMSessionAsync
28
28
  from reykit.rbase import Base, Exit, StaticMeta, Singleton, throw
29
+ from reykit.ros import File, Folder
29
30
 
30
31
  from . import rserver
31
32
 
@@ -40,7 +41,9 @@ __all__ = (
40
41
  'ServerBindInstanceDatabaseSession',
41
42
  'ServerBindInstance',
42
43
  'ServerBind',
43
- 'Bind'
44
+ 'Bind',
45
+ 'router_test',
46
+ 'router_public'
44
47
  )
45
48
 
46
49
 
@@ -311,6 +314,26 @@ class ServerBindInstance(ServerBase, Singleton):
311
314
  return forms
312
315
 
313
316
 
317
+ async def depend_server(request: Request) -> 'rserver.Server':
318
+ """
319
+ Dependencie function of now Server instance.
320
+
321
+ Parameters
322
+ ----------
323
+ request : Request.
324
+
325
+ Returns
326
+ -------
327
+ Server.
328
+ """
329
+
330
+ # Get.
331
+ app: FastAPI = request.app
332
+ server: rserver.Server = app.extra['server']
333
+
334
+ return server
335
+
336
+
314
337
  class ServerBind(ServerBase, metaclass=StaticMeta):
315
338
  """
316
339
  Server API bind parameter type.
@@ -340,7 +363,7 @@ class ServerBind(ServerBase, metaclass=StaticMeta):
340
363
  Sess = DatabaseORMSessionAsync
341
364
  Server = Type['rserver.Server']
342
365
  'Server type.'
343
- server: Depend
366
+ server: Depend = Depend(depend_server)
344
367
  'Server instance dependency type.'
345
368
  i = ServerBindInstance()
346
369
  'Server API bind parameter build instance.'
@@ -353,11 +376,11 @@ class ServerBind(ServerBase, metaclass=StaticMeta):
353
376
 
354
377
 
355
378
  Bind = ServerBind
379
+ router_test = APIRouter()
380
+ router_public = APIRouter()
356
381
 
357
- router_base = APIRouter()
358
382
 
359
-
360
- @router_base.get('/test')
383
+ @router_test.get('/test')
361
384
  def test() -> Literal['test']:
362
385
  """
363
386
  Test.
@@ -373,8 +396,8 @@ def test() -> Literal['test']:
373
396
  return response
374
397
 
375
398
 
376
- @router_base.post('/test/echo')
377
- def echo(data: dict = Bind.i.body) -> dict:
399
+ @router_test.post('/test/echo')
400
+ def test_echo(data: dict = Bind.i.body) -> dict:
378
401
  """
379
402
  Echo test.
380
403
 
@@ -390,3 +413,41 @@ def echo(data: dict = Bind.i.body) -> dict:
390
413
  # Resposne.
391
414
 
392
415
  return data
416
+
417
+
418
+ @router_public.get('/')
419
+ def home(server: Bind.Server = Bind.server) -> HTMLResponse:
420
+ """
421
+ Home page.
422
+
423
+ Parameters
424
+ ----------
425
+ Home page HTML content.
426
+ """
427
+
428
+ # Parameter.
429
+ public_dir = server.api_public_dir
430
+ file_path = Folder(public_dir) + 'index.html'
431
+ file = File(file_path)
432
+
433
+ # Response.
434
+ response = HTMLResponse(file.str)
435
+
436
+ return response
437
+
438
+
439
+ @router_public.get('/public/{relpath}')
440
+ def get_public_file(relpath: str = Bind.i.path) -> FileResponse:
441
+ """
442
+ Get public file.
443
+
444
+ Parameters
445
+ ----------
446
+ relpath : Relative path of based on public directory.
447
+
448
+ Returns
449
+ -------
450
+ File.
451
+ """
452
+
453
+ ...
reyserver/rserver.py CHANGED
@@ -19,6 +19,7 @@ from starlette.middleware.base import _StreamingResponse
19
19
  from fastapi import FastAPI, Request
20
20
  from fastapi.staticfiles import StaticFiles
21
21
  from fastapi.middleware.gzip import GZipMiddleware
22
+ from fastapi.middleware.trustedhost import TrustedHostMiddleware
22
23
  from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware
23
24
  from reydb import DatabaseAsync
24
25
  from reykit.rbase import CoroutineFunctionSimple, Singleton, throw
@@ -42,14 +43,12 @@ class Server(ServerBase, Singleton):
42
43
 
43
44
  def __init__(
44
45
  self,
45
- db: DatabaseAsync,
46
- public: str | None = None,
46
+ db: DatabaseAsync | None = None,
47
+ db_warm: bool = False,
47
48
  depend: CoroutineFunctionSimple | Sequence[CoroutineFunctionSimple] | None = None,
48
49
  before: CoroutineFunctionSimple | Sequence[CoroutineFunctionSimple] | None = None,
49
50
  after: CoroutineFunctionSimple | Sequence[CoroutineFunctionSimple] | None = None,
50
- ssl_cert: str | None = None,
51
- ssl_key: str | None = None,
52
- db_warm: bool = False,
51
+ to_https: bool = False,
53
52
  debug: bool = False
54
53
  ) -> None:
55
54
  """
@@ -58,19 +57,15 @@ class Server(ServerBase, Singleton):
58
57
  Parameters
59
58
  ----------
60
59
  db : Asynchronous database, must include database engines with APIs.
61
- public : Public directory.
60
+ db_warm : Whether database pre create connection to warm all pool.
62
61
  depend : Global api dependencies.
63
62
  before : Execute before server start.
64
63
  after : Execute after server end.
65
- ssl_cert : SSL certificate file path.
66
- ssl_key : SSL key file path.
67
- db_warm : Whether database pre create connection to warm all pool.
64
+ to_https : Whehter redirect http to https.
68
65
  debug : Whether use development mode debug server.
69
66
  """
70
67
 
71
68
  # Parameter.
72
- if type(ssl_cert) != type(ssl_key):
73
- throw(AssertionError, ssl_cert, ssl_key)
74
69
  if depend is None:
75
70
  depend = ()
76
71
  elif iscoroutinefunction(depend):
@@ -83,8 +78,6 @@ class Server(ServerBase, Singleton):
83
78
 
84
79
  # Build.
85
80
  self.db = db
86
- self.ssl_cert = ssl_cert
87
- self.ssl_key = ssl_key
88
81
  self.app = FastAPI(
89
82
  dependencies=depend,
90
83
  lifespan=lifespan,
@@ -92,22 +85,20 @@ class Server(ServerBase, Singleton):
92
85
  server=self
93
86
  )
94
87
 
95
- # Public file.
96
- if public is not None:
97
- subapp = StaticFiles(directory=public, html=True)
98
- self.app.mount('/', subapp)
99
-
100
88
  # Middleware
101
89
  self.wrap_middleware = self.app.middleware('http')
102
90
  'Decorator, add middleware to APP.'
103
91
  self.app.add_middleware(GZipMiddleware)
104
- if not debug:
92
+ self.app.add_middleware(TrustedHostMiddleware)
93
+ if to_https:
105
94
  self.app.add_middleware(HTTPSRedirectMiddleware)
106
95
  self.__add_base_middleware()
107
96
 
108
97
  # API.
109
98
  self.is_started_auth: bool = False
110
99
  'Whether start authentication.'
100
+ self.api_public_dir: str
101
+ 'Public directory.'
111
102
  self.api_auth_key: str
112
103
  'Authentication API JWT encryption key.'
113
104
  self.api_auth_sess_seconds: int
@@ -241,7 +232,9 @@ class Server(ServerBase, Singleton):
241
232
  host: str = '127.0.0.1',
242
233
  port: int = 8000,
243
234
  app: str | None = None,
244
- workers: int = 1
235
+ workers: int = 1,
236
+ ssl_cert: str | None = None,
237
+ ssl_key: str | None = None
245
238
  ) -> None:
246
239
  """
247
240
  Run server.
@@ -255,6 +248,8 @@ class Server(ServerBase, Singleton):
255
248
  - `Application`: format is `module[.sub....]:var[.attr....]` (e.g. `module.sub:server.app`).
256
249
  - `Function`: format is `module[.sub....]:func` (e.g. `module.sub:main`).
257
250
  workers: Number of server work processes.
251
+ ssl_cert : SSL certificate file path.
252
+ ssl_key : SSL key file path.
258
253
 
259
254
  Examples
260
255
  --------
@@ -266,20 +261,15 @@ class Server(ServerBase, Singleton):
266
261
  >>> server = Server(db)
267
262
  >>> if __name__ == '__main__':
268
263
  >>> server('module.sub:server.app', workers=2)
269
-
270
- Multiple work processes and define function.
271
- >>> def main(run = False):
272
- >>> server = Server(db)
273
- >>> if run:
274
- >>> server('module.sub:main', workers=2, factory=True)
275
- >>> return server.app
276
- >>> if __name__ == '__main__':
277
- >>> main(True)
278
264
  """
279
265
 
280
266
  # Parameter.
267
+ if type(ssl_cert) != type(ssl_key):
268
+ throw(AssertionError, ssl_cert, ssl_key)
281
269
  if app is None:
282
270
  app = self.app
271
+ if workers == 1:
272
+ workers = None
283
273
 
284
274
  # Run.
285
275
  uvicorn_run(
@@ -287,8 +277,8 @@ class Server(ServerBase, Singleton):
287
277
  host=host,
288
278
  port=port,
289
279
  workers=workers,
290
- ssl_certfile=self.ssl_cert,
291
- ssl_keyfile=self.ssl_key
280
+ ssl_certfile=ssl_cert,
281
+ ssl_keyfile=ssl_key
292
282
  )
293
283
 
294
284
 
@@ -330,15 +320,34 @@ class Server(ServerBase, Singleton):
330
320
  setattr(self.app, key, value)
331
321
 
332
322
 
333
- def add_api_base(self) -> None:
323
+ def add_api_test(self) -> None:
334
324
  """
335
- Add base API.
325
+ Add test API.
336
326
  """
337
327
 
338
- from .rbase import router_base
328
+ from .rbase import router_test
339
329
 
340
330
  # Add.
341
- self.app.include_router(router_base, tags=['test'])
331
+ self.app.include_router(router_test, tags=['test'])
332
+
333
+
334
+ def add_api_public(self, path: str) -> None:
335
+ """
336
+ Add public API,
337
+ mapping `{path}/index.html` to 'GET /',
338
+ mapping `{path}/{sub_path}` to `GET /public/{sub_path}`.
339
+
340
+ Parameters
341
+ path : Public directory.
342
+ """
343
+
344
+ from .rbase import router_public
345
+
346
+ # Add.
347
+ self.api_public_dir = path
348
+ self.app.include_router(router_public, tags=['public'])
349
+ subapp = StaticFiles(directory=path)
350
+ self.app.mount('/public', subapp)
342
351
 
343
352
 
344
353
  def add_api_auth(self, key: str | None = None, sess_seconds: int = 28800) -> None:
@@ -395,25 +404,4 @@ class Server(ServerBase, Singleton):
395
404
  self.app.include_router(router_file, tags=['file'], dependencies=(Bind.token,))
396
405
 
397
406
 
398
- async def depend_server(request: Request) -> Server:
399
- """
400
- Dependencie function of now Server instance.
401
-
402
- Parameters
403
- ----------
404
- request : Request.
405
-
406
- Returns
407
- -------
408
- Server.
409
- """
410
-
411
- # Get.
412
- app: FastAPI = request.app
413
- server = app.extra['server']
414
-
415
- return server
416
-
417
-
418
407
  Bind.Server = Server
419
- Bind.server = Bind.Depend(depend_server)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reyserver
3
- Version: 1.1.65
3
+ Version: 1.1.67
4
4
  Summary: Backend server method set.
5
5
  Project-URL: homepage, https://github.com/reyxbo/reyserver/
6
6
  Author-email: Rey <reyxbo@163.com>
@@ -0,0 +1,11 @@
1
+ reyserver/__init__.py,sha256=7GX64p7uI2eetJH9NJ-DTg-8iyQwOsGcviADFJCPxVA,373
2
+ reyserver/rall.py,sha256=riyDRTUsigco_Bee1H4aZFb8IgvjnxdX9qcnVb9i9mE,270
3
+ reyserver/rauth.py,sha256=mqyo5FsN4vdW5GRgvZssWcpfku1Dfo_Md8vvoo8JzhU,15122
4
+ reyserver/rbase.py,sha256=YppTpCTF36t10b20MmHsMKgiNRxmYoFmSvTUDeo-dF8,8988
5
+ reyserver/rclient.py,sha256=og5YuWm-PODkFn9njBwYQpGlk0j1BfqFuEarlCFSQYI,6229
6
+ reyserver/rfile.py,sha256=6H5_7B9aiA3F56VToQDI9Trarkrl9gcIuFqYyCVCiCU,8877
7
+ reyserver/rserver.py,sha256=L_a92THAZHca1WHdGczoRf-rnIw5-aGcFuAfvhd5r9w,11332
8
+ reyserver-1.1.67.dist-info/METADATA,sha256=QIOmai1QMrVR9r_jiJmCTaisBqxzUTR2tiZlcrcnf8A,1666
9
+ reyserver-1.1.67.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
10
+ reyserver-1.1.67.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
11
+ reyserver-1.1.67.dist-info/RECORD,,
@@ -1,11 +0,0 @@
1
- reyserver/__init__.py,sha256=7GX64p7uI2eetJH9NJ-DTg-8iyQwOsGcviADFJCPxVA,373
2
- reyserver/rall.py,sha256=riyDRTUsigco_Bee1H4aZFb8IgvjnxdX9qcnVb9i9mE,270
3
- reyserver/rauth.py,sha256=JGo5lLTRGoP1SFPyQA-Q5EE-O3OU_86Mb3pvwhvFu-w,15125
4
- reyserver/rbase.py,sha256=0ECJ1zuUpJhwaNc0u5GvR5VyGxIAnKQep-EdotwnLoE,7752
5
- reyserver/rclient.py,sha256=og5YuWm-PODkFn9njBwYQpGlk0j1BfqFuEarlCFSQYI,6229
6
- reyserver/rfile.py,sha256=6H5_7B9aiA3F56VToQDI9Trarkrl9gcIuFqYyCVCiCU,8877
7
- reyserver/rserver.py,sha256=IJY28_p-DAJ_6BUxVMdHQHVSyIficCzxnZRMPL6wMhQ,11474
8
- reyserver-1.1.65.dist-info/METADATA,sha256=AjAAJWgQb9zKkUHk5qx51rzOooZ97P62o2cR27iemMo,1666
9
- reyserver-1.1.65.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
10
- reyserver-1.1.65.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
11
- reyserver-1.1.65.dist-info/RECORD,,