1
0

data.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. """This module contains the dataclasses representing the router object."""
  2. import dataclasses
  3. from typing import Optional
  4. from reflex import constants
  5. from reflex.utils import format
  6. @dataclasses.dataclass(frozen=True)
  7. class HeaderData:
  8. """An object containing headers data."""
  9. host: str = ""
  10. origin: str = ""
  11. upgrade: str = ""
  12. connection: str = ""
  13. cookie: str = ""
  14. pragma: str = ""
  15. cache_control: str = ""
  16. user_agent: str = ""
  17. sec_websocket_version: str = ""
  18. sec_websocket_key: str = ""
  19. sec_websocket_extensions: str = ""
  20. accept_encoding: str = ""
  21. accept_language: str = ""
  22. def __init__(self, router_data: Optional[dict] = None):
  23. """Initialize the HeaderData object based on router_data.
  24. Args:
  25. router_data: the router_data dict.
  26. """
  27. if router_data:
  28. for k, v in router_data.get(constants.RouteVar.HEADERS, {}).items():
  29. object.__setattr__(self, format.to_snake_case(k), v)
  30. else:
  31. for k in dataclasses.fields(self):
  32. object.__setattr__(self, k.name, "")
  33. @dataclasses.dataclass(frozen=True)
  34. class PageData:
  35. """An object containing page data."""
  36. host: str = "" # repeated with self.headers.origin (remove or keep the duplicate?)
  37. path: str = ""
  38. raw_path: str = ""
  39. full_path: str = ""
  40. full_raw_path: str = ""
  41. params: dict = dataclasses.field(default_factory=dict)
  42. def __init__(self, router_data: Optional[dict] = None):
  43. """Initialize the PageData object based on router_data.
  44. Args:
  45. router_data: the router_data dict.
  46. """
  47. if router_data:
  48. object.__setattr__(
  49. self,
  50. "host",
  51. router_data.get(constants.RouteVar.HEADERS, {}).get("origin", ""),
  52. )
  53. object.__setattr__(
  54. self, "path", router_data.get(constants.RouteVar.PATH, "")
  55. )
  56. object.__setattr__(
  57. self, "raw_path", router_data.get(constants.RouteVar.ORIGIN, "")
  58. )
  59. object.__setattr__(self, "full_path", f"{self.host}{self.path}")
  60. object.__setattr__(self, "full_raw_path", f"{self.host}{self.raw_path}")
  61. object.__setattr__(
  62. self, "params", router_data.get(constants.RouteVar.QUERY, {})
  63. )
  64. else:
  65. object.__setattr__(self, "host", "")
  66. object.__setattr__(self, "path", "")
  67. object.__setattr__(self, "raw_path", "")
  68. object.__setattr__(self, "full_path", "")
  69. object.__setattr__(self, "full_raw_path", "")
  70. object.__setattr__(self, "params", {})
  71. @dataclasses.dataclass(frozen=True, init=False)
  72. class SessionData:
  73. """An object containing session data."""
  74. client_token: str = ""
  75. client_ip: str = ""
  76. session_id: str = ""
  77. def __init__(self, router_data: Optional[dict] = None):
  78. """Initialize the SessionData object based on router_data.
  79. Args:
  80. router_data: the router_data dict.
  81. """
  82. if router_data:
  83. client_token = router_data.get(constants.RouteVar.CLIENT_TOKEN, "")
  84. client_ip = router_data.get(constants.RouteVar.CLIENT_IP, "")
  85. session_id = router_data.get(constants.RouteVar.SESSION_ID, "")
  86. else:
  87. client_token = client_ip = session_id = ""
  88. object.__setattr__(self, "client_token", client_token)
  89. object.__setattr__(self, "client_ip", client_ip)
  90. object.__setattr__(self, "session_id", session_id)
  91. @dataclasses.dataclass(frozen=True, init=False)
  92. class RouterData:
  93. """An object containing RouterData."""
  94. session: SessionData = dataclasses.field(default_factory=SessionData)
  95. headers: HeaderData = dataclasses.field(default_factory=HeaderData)
  96. page: PageData = dataclasses.field(default_factory=PageData)
  97. def __init__(self, router_data: Optional[dict] = None):
  98. """Initialize the RouterData object.
  99. Args:
  100. router_data: the router_data dict.
  101. """
  102. object.__setattr__(self, "session", SessionData(router_data))
  103. object.__setattr__(self, "headers", HeaderData(router_data))
  104. object.__setattr__(self, "page", PageData(router_data))