nicegui.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import asyncio
  2. import urllib.parse
  3. from pathlib import Path
  4. from typing import Dict
  5. from fastapi import FastAPI
  6. from fastapi.middleware.gzip import GZipMiddleware
  7. from fastapi.responses import FileResponse
  8. from fastapi.staticfiles import StaticFiles
  9. from fastapi_socketio import SocketManager
  10. from . import binding, globals, vue
  11. from .client import Client
  12. from .task_logger import create_task
  13. globals.app = app = FastAPI()
  14. globals.sio = sio = SocketManager(app=app)._sio
  15. app.add_middleware(GZipMiddleware)
  16. app.mount("/static", StaticFiles(directory=Path(__file__).parent / 'static'), name='static')
  17. Client().__enter__()
  18. @app.get('/')
  19. def index():
  20. return globals.client_stack[-1].build_response()
  21. @app.get('/_vue/dependencies/{path:path}')
  22. def vue_dependencies(path: str):
  23. return FileResponse(path, media_type='text/javascript')
  24. @app.get('/_vue/components/{name}')
  25. def vue_dependencies(name: str):
  26. return FileResponse(vue.js_components[name], media_type='text/javascript')
  27. @app.on_event('startup')
  28. def on_startup() -> None:
  29. globals.loop = asyncio.get_running_loop()
  30. create_task(binding.loop())
  31. @sio.on('connect')
  32. async def handle_connect(sid: str, _) -> None:
  33. client = get_client(sid)
  34. client.environ = sio.get_environ(sid)
  35. sio.enter_room(sid, str(client.id))
  36. @sio.on('event')
  37. def handle_event(sid: str, msg: Dict) -> None:
  38. client = get_client(sid)
  39. with client:
  40. sender = client.elements.get(msg['id'])
  41. if sender:
  42. sender.handle_event(msg)
  43. def get_client(sid: str) -> Client:
  44. query_bytes: bytearray = sio.get_environ(sid)['asgi.scope']['query_string']
  45. query = urllib.parse.parse_qs(query_bytes.decode())
  46. client_id = int(query['client_id'][0])
  47. return globals.clients[client_id]