reactpy_django 5.0.0__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.
Files changed (118) hide show
  1. js/node_modules/@pyscript/core/src/stdlib/pyscript/__init__.py +61 -0
  2. js/node_modules/@pyscript/core/src/stdlib/pyscript/display.py +177 -0
  3. js/node_modules/@pyscript/core/src/stdlib/pyscript/event_handling.py +76 -0
  4. js/node_modules/@pyscript/core/src/stdlib/pyscript/fetch.py +87 -0
  5. js/node_modules/@pyscript/core/src/stdlib/pyscript/ffi.py +18 -0
  6. js/node_modules/@pyscript/core/src/stdlib/pyscript/flatted.py +148 -0
  7. js/node_modules/@pyscript/core/src/stdlib/pyscript/magic_js.py +79 -0
  8. js/node_modules/@pyscript/core/src/stdlib/pyscript/storage.py +60 -0
  9. js/node_modules/@pyscript/core/src/stdlib/pyscript/util.py +33 -0
  10. js/node_modules/@pyscript/core/src/stdlib/pyscript/web.py +1176 -0
  11. js/node_modules/@pyscript/core/src/stdlib/pyscript/websocket.py +71 -0
  12. js/node_modules/@pyscript/core/src/stdlib/pyscript/workers.py +43 -0
  13. js/node_modules/flatted/python/flatted.py +149 -0
  14. js/node_modules/flatted/python/test.py +63 -0
  15. js/node_modules/polyscript/python/mip.py +288 -0
  16. reactpy_django/__init__.py +32 -0
  17. reactpy_django/apps.py +11 -0
  18. reactpy_django/checks.py +558 -0
  19. reactpy_django/clean.py +141 -0
  20. reactpy_django/components.py +284 -0
  21. reactpy_django/config.py +128 -0
  22. reactpy_django/database.py +31 -0
  23. reactpy_django/decorators.py +65 -0
  24. reactpy_django/exceptions.py +34 -0
  25. reactpy_django/hooks.py +469 -0
  26. reactpy_django/html.py +3 -0
  27. reactpy_django/http/__init__.py +0 -0
  28. reactpy_django/http/urls.py +18 -0
  29. reactpy_django/http/views.py +62 -0
  30. reactpy_django/management/__init__.py +0 -0
  31. reactpy_django/management/commands/__init__.py +0 -0
  32. reactpy_django/management/commands/clean_reactpy.py +37 -0
  33. reactpy_django/migrations/0001_initial.py +25 -0
  34. reactpy_django/migrations/0002_rename_created_at_componentparams_last_accessed.py +17 -0
  35. reactpy_django/migrations/0003_componentsession_delete_componentparams.py +28 -0
  36. reactpy_django/migrations/0004_config.py +27 -0
  37. reactpy_django/migrations/0005_alter_componentsession_last_accessed.py +17 -0
  38. reactpy_django/migrations/0006_userdatamodel.py +28 -0
  39. reactpy_django/migrations/__init__.py +0 -0
  40. reactpy_django/models.py +48 -0
  41. reactpy_django/py.typed +1 -0
  42. reactpy_django/pyscript/__init__.py +0 -0
  43. reactpy_django/pyscript/component_template.py +26 -0
  44. reactpy_django/pyscript/layout_handler.py +139 -0
  45. reactpy_django/router/__init__.py +5 -0
  46. reactpy_django/router/converters.py +8 -0
  47. reactpy_django/router/resolvers.py +22 -0
  48. reactpy_django/static/reactpy_django/client.js +1 -0
  49. reactpy_django/static/reactpy_django/morphdom/morphdom-esm.js +769 -0
  50. reactpy_django/static/reactpy_django/morphdom/morphdom-factory.js +705 -0
  51. reactpy_django/static/reactpy_django/morphdom/morphdom-umd.js +777 -0
  52. reactpy_django/static/reactpy_django/morphdom/morphdom-umd.min.js +1 -0
  53. reactpy_django/static/reactpy_django/morphdom/morphdom.js +771 -0
  54. reactpy_django/static/reactpy_django/pyscript/codemirror-BEtcgaoQ.js +2 -0
  55. reactpy_django/static/reactpy_django/pyscript/codemirror-BEtcgaoQ.js.map +1 -0
  56. reactpy_django/static/reactpy_django/pyscript/codemirror_commands-DDxffOmd.js +2 -0
  57. reactpy_django/static/reactpy_django/pyscript/codemirror_commands-DDxffOmd.js.map +1 -0
  58. reactpy_django/static/reactpy_django/pyscript/codemirror_lang-python-CnWnFqxD.js +2 -0
  59. reactpy_django/static/reactpy_django/pyscript/codemirror_lang-python-CnWnFqxD.js.map +1 -0
  60. reactpy_django/static/reactpy_django/pyscript/codemirror_language-CjmvX4ix.js +2 -0
  61. reactpy_django/static/reactpy_django/pyscript/codemirror_language-CjmvX4ix.js.map +1 -0
  62. reactpy_django/static/reactpy_django/pyscript/codemirror_state-D1qTXrff.js +2 -0
  63. reactpy_django/static/reactpy_django/pyscript/codemirror_state-D1qTXrff.js.map +1 -0
  64. reactpy_django/static/reactpy_django/pyscript/codemirror_view-DVb8uYMr.js +2 -0
  65. reactpy_django/static/reactpy_django/pyscript/codemirror_view-DVb8uYMr.js.map +1 -0
  66. reactpy_django/static/reactpy_django/pyscript/core-CjO3FOKB.js +2 -0
  67. reactpy_django/static/reactpy_django/pyscript/core-CjO3FOKB.js.map +1 -0
  68. reactpy_django/static/reactpy_django/pyscript/core.css +1 -0
  69. reactpy_django/static/reactpy_django/pyscript/core.js +2 -0
  70. reactpy_django/static/reactpy_django/pyscript/core.js.map +1 -0
  71. reactpy_django/static/reactpy_django/pyscript/deprecations-manager-pFtn19mE.js +2 -0
  72. reactpy_django/static/reactpy_django/pyscript/deprecations-manager-pFtn19mE.js.map +1 -0
  73. reactpy_django/static/reactpy_django/pyscript/error-tq-z48YI.js +2 -0
  74. reactpy_django/static/reactpy_django/pyscript/error-tq-z48YI.js.map +1 -0
  75. reactpy_django/static/reactpy_django/pyscript/index-S1Do43bx.js +2 -0
  76. reactpy_django/static/reactpy_django/pyscript/index-S1Do43bx.js.map +1 -0
  77. reactpy_django/static/reactpy_django/pyscript/mpy-DovD7Qjy.js +2 -0
  78. reactpy_django/static/reactpy_django/pyscript/mpy-DovD7Qjy.js.map +1 -0
  79. reactpy_django/static/reactpy_django/pyscript/py-BUsUWVJg.js +2 -0
  80. reactpy_django/static/reactpy_django/pyscript/py-BUsUWVJg.js.map +1 -0
  81. reactpy_django/static/reactpy_django/pyscript/py-editor-CeySmmer.js +2 -0
  82. reactpy_django/static/reactpy_django/pyscript/py-editor-CeySmmer.js.map +1 -0
  83. reactpy_django/static/reactpy_django/pyscript/py-terminal-CH_wV7wQ.js +2 -0
  84. reactpy_django/static/reactpy_django/pyscript/py-terminal-CH_wV7wQ.js.map +1 -0
  85. reactpy_django/static/reactpy_django/pyscript/storage.js +2 -0
  86. reactpy_django/static/reactpy_django/pyscript/storage.js.map +1 -0
  87. reactpy_django/static/reactpy_django/pyscript/toml-CvAfdf9_.js +3 -0
  88. reactpy_django/static/reactpy_django/pyscript/toml-CvAfdf9_.js.map +1 -0
  89. reactpy_django/static/reactpy_django/pyscript/toml-DiUM0_qs.js +3 -0
  90. reactpy_django/static/reactpy_django/pyscript/toml-DiUM0_qs.js.map +1 -0
  91. reactpy_django/static/reactpy_django/pyscript/xterm-BY7uk_OU.js +2 -0
  92. reactpy_django/static/reactpy_django/pyscript/xterm-BY7uk_OU.js.map +1 -0
  93. reactpy_django/static/reactpy_django/pyscript/xterm-readline-CZfBw7ic.js +2 -0
  94. reactpy_django/static/reactpy_django/pyscript/xterm-readline-CZfBw7ic.js.map +1 -0
  95. reactpy_django/static/reactpy_django/pyscript/xterm.css +7 -0
  96. reactpy_django/static/reactpy_django/pyscript/xterm_addon-fit--gyF3PcZ.js +2 -0
  97. reactpy_django/static/reactpy_django/pyscript/xterm_addon-fit--gyF3PcZ.js.map +1 -0
  98. reactpy_django/static/reactpy_django/pyscript/xterm_addon-web-links-Cnej-nJ6.js +2 -0
  99. reactpy_django/static/reactpy_django/pyscript/xterm_addon-web-links-Cnej-nJ6.js.map +1 -0
  100. reactpy_django/static/reactpy_django/pyscript/zip-DrwYHuF9.js +2 -0
  101. reactpy_django/static/reactpy_django/pyscript/zip-DrwYHuF9.js.map +1 -0
  102. reactpy_django/static/reactpy_django/pyscript-custom.css +3 -0
  103. reactpy_django/static/reactpy_django/pyscript-hide-debug.css +3 -0
  104. reactpy_django/templates/reactpy/component.html +27 -0
  105. reactpy_django/templates/reactpy/pyscript_component.html +2 -0
  106. reactpy_django/templates/reactpy/pyscript_setup.html +8 -0
  107. reactpy_django/templatetags/__init__.py +0 -0
  108. reactpy_django/templatetags/reactpy.py +250 -0
  109. reactpy_django/types.py +81 -0
  110. reactpy_django/utils.py +560 -0
  111. reactpy_django/websocket/__init__.py +0 -0
  112. reactpy_django/websocket/consumer.py +227 -0
  113. reactpy_django/websocket/paths.py +15 -0
  114. reactpy_django-5.0.0.dist-info/LICENSE.md +9 -0
  115. reactpy_django-5.0.0.dist-info/METADATA +152 -0
  116. reactpy_django-5.0.0.dist-info/RECORD +118 -0
  117. reactpy_django-5.0.0.dist-info/WHEEL +5 -0
  118. reactpy_django-5.0.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,227 @@
1
+ """Anything used to construct a websocket endpoint"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import contextlib
7
+ import logging
8
+ import traceback
9
+ from concurrent.futures import Future
10
+ from datetime import timedelta
11
+ from threading import Thread
12
+ from typing import TYPE_CHECKING, Any, MutableMapping, Sequence
13
+ from urllib.parse import parse_qs
14
+
15
+ import dill as pickle
16
+ import orjson
17
+ from channels.auth import login
18
+ from channels.db import database_sync_to_async
19
+ from channels.generic.websocket import AsyncJsonWebsocketConsumer
20
+ from django.utils import timezone
21
+ from reactpy.backend.hooks import ConnectionContext
22
+ from reactpy.backend.types import Connection, Location
23
+ from reactpy.core.layout import Layout
24
+ from reactpy.core.serve import serve_layout
25
+
26
+ from reactpy_django.clean import clean
27
+ from reactpy_django.types import ComponentParams
28
+
29
+ if TYPE_CHECKING:
30
+ from django.contrib.auth.models import AbstractUser
31
+
32
+ from reactpy_django import models
33
+
34
+ _logger = logging.getLogger(__name__)
35
+ BACKHAUL_LOOP = asyncio.new_event_loop()
36
+
37
+
38
+ def start_backhaul_loop():
39
+ """Starts the asyncio event loop that will perform component rendering tasks."""
40
+ asyncio.set_event_loop(BACKHAUL_LOOP)
41
+ BACKHAUL_LOOP.run_forever()
42
+
43
+
44
+ BACKHAUL_THREAD = Thread(
45
+ target=start_backhaul_loop, daemon=True, name="ReactPyBackhaul"
46
+ )
47
+
48
+
49
+ class ReactpyAsyncWebsocketConsumer(AsyncJsonWebsocketConsumer):
50
+ """Communicates with the browser to perform actions on-demand."""
51
+
52
+ def __init__(self, *args, **kwargs):
53
+ super().__init__(*args, **kwargs)
54
+
55
+ # New WebsocketConsumer attributes created by ReactPy
56
+ self.dispatcher: Future | asyncio.Task
57
+ self.threaded: bool
58
+ self.recv_queue: asyncio.Queue
59
+ self.dotted_path: str
60
+ self.component_session: "models.ComponentSession" | None = None
61
+
62
+ async def connect(self) -> None:
63
+ """The browser has connected."""
64
+ from reactpy_django.config import (
65
+ REACTPY_AUTH_BACKEND,
66
+ REACTPY_AUTO_RELOGIN,
67
+ REACTPY_BACKHAUL_THREAD,
68
+ )
69
+
70
+ await super().connect()
71
+
72
+ # Automatically re-login the user, if needed
73
+ user: AbstractUser | None = self.scope.get("user")
74
+ if REACTPY_AUTO_RELOGIN and user and user.is_authenticated and user.is_active:
75
+ try:
76
+ await login(self.scope, user, backend=REACTPY_AUTH_BACKEND)
77
+ except Exception:
78
+ await asyncio.to_thread(
79
+ _logger.error,
80
+ "ReactPy websocket authentication has failed!\n"
81
+ f"{traceback.format_exc()}",
82
+ )
83
+ try:
84
+ await database_sync_to_async(self.scope["session"].save)()
85
+ except Exception:
86
+ await asyncio.to_thread(
87
+ _logger.error,
88
+ "ReactPy has failed to save scope['session']!\n"
89
+ f"{traceback.format_exc()}",
90
+ )
91
+
92
+ # Start the component dispatcher
93
+ self.threaded = REACTPY_BACKHAUL_THREAD
94
+ if self.threaded:
95
+ if not BACKHAUL_THREAD.is_alive():
96
+ await asyncio.to_thread(
97
+ _logger.debug, "Starting ReactPy backhaul thread."
98
+ )
99
+ BACKHAUL_THREAD.start()
100
+ self.dispatcher = asyncio.run_coroutine_threadsafe(
101
+ self.run_dispatcher(), BACKHAUL_LOOP
102
+ )
103
+ else:
104
+ self.dispatcher = asyncio.create_task(self.run_dispatcher())
105
+
106
+ async def disconnect(self, code: int) -> None:
107
+ """The browser has disconnected."""
108
+ from reactpy_django.config import REACTPY_CLEAN_INTERVAL
109
+
110
+ self.dispatcher.cancel()
111
+
112
+ # Update the component's last_accessed timestamp
113
+ if self.component_session:
114
+ try:
115
+ await self.component_session.asave()
116
+ except Exception:
117
+ await asyncio.to_thread(
118
+ _logger.error,
119
+ "ReactPy has failed to save component session!\n"
120
+ f"{traceback.format_exc()}",
121
+ )
122
+
123
+ # Queue a cleanup, if needed
124
+ if REACTPY_CLEAN_INTERVAL is not None:
125
+ try:
126
+ await database_sync_to_async(clean)()
127
+ except Exception:
128
+ await asyncio.to_thread(
129
+ _logger.error,
130
+ "ReactPy cleaning failed!\n" f"{traceback.format_exc()}",
131
+ )
132
+
133
+ await super().disconnect(code)
134
+
135
+ async def receive_json(self, content: Any, **_) -> None:
136
+ """Receive a message from the browser. Typically, messages are event signals."""
137
+ if self.threaded:
138
+ asyncio.run_coroutine_threadsafe(
139
+ self.recv_queue.put(content), BACKHAUL_LOOP
140
+ )
141
+ else:
142
+ await self.recv_queue.put(content)
143
+
144
+ @classmethod
145
+ async def decode_json(cls, text_data):
146
+ return orjson.loads(text_data)
147
+
148
+ @classmethod
149
+ async def encode_json(cls, content):
150
+ return orjson.dumps(content).decode()
151
+
152
+ async def run_dispatcher(self):
153
+ """Runs the main loop that performs component rendering tasks."""
154
+ from reactpy_django import models
155
+ from reactpy_django.config import (
156
+ REACTPY_REGISTERED_COMPONENTS,
157
+ REACTPY_SESSION_MAX_AGE,
158
+ )
159
+
160
+ scope = self.scope
161
+ self.dotted_path = scope["url_route"]["kwargs"]["dotted_path"]
162
+ uuid = scope["url_route"]["kwargs"].get("uuid")
163
+ has_args = scope["url_route"]["kwargs"].get("has_args")
164
+ scope["reactpy"] = {"id": str(uuid)}
165
+ query_string = parse_qs(scope["query_string"].decode(), strict_parsing=True)
166
+ http_pathname = query_string.get("http_pathname", [""])[0]
167
+ http_search = query_string.get("http_search", [""])[0]
168
+ self.recv_queue = asyncio.Queue()
169
+ connection = Connection( # For `use_connection`
170
+ scope=scope,
171
+ location=Location(pathname=http_pathname, search=http_search),
172
+ carrier=self,
173
+ )
174
+ now = timezone.now()
175
+ component_session_args: Sequence[Any] = ()
176
+ component_session_kwargs: MutableMapping[str, Any] = {}
177
+
178
+ # Verify the component has already been registered
179
+ try:
180
+ root_component_constructor = REACTPY_REGISTERED_COMPONENTS[self.dotted_path]
181
+ except KeyError:
182
+ await asyncio.to_thread(
183
+ _logger.warning,
184
+ f"Attempt to access invalid ReactPy component: {self.dotted_path!r}",
185
+ )
186
+ return
187
+
188
+ # Construct the component. This may require fetching the component's args/kwargs from the database.
189
+ try:
190
+ if has_args:
191
+ self.component_session = await models.ComponentSession.objects.aget(
192
+ uuid=uuid,
193
+ last_accessed__gt=now - timedelta(seconds=REACTPY_SESSION_MAX_AGE),
194
+ )
195
+ params: ComponentParams = pickle.loads(self.component_session.params)
196
+ component_session_args = params.args
197
+ component_session_kwargs = params.kwargs
198
+
199
+ # Generate the initial component instance
200
+ root_component = root_component_constructor(
201
+ *component_session_args, **component_session_kwargs
202
+ )
203
+ except models.ComponentSession.DoesNotExist:
204
+ await asyncio.to_thread(
205
+ _logger.warning,
206
+ f"Component session for '{self.dotted_path}:{uuid}' not found. The "
207
+ "session may have already expired beyond REACTPY_SESSION_MAX_AGE. "
208
+ "If you are using a custom `host`, you may have forgotten to provide "
209
+ "args/kwargs.",
210
+ )
211
+ return
212
+ except Exception:
213
+ await asyncio.to_thread(
214
+ _logger.error,
215
+ f"Failed to construct component {root_component_constructor} "
216
+ f"with args='{component_session_args}' kwargs='{component_session_kwargs}'!\n"
217
+ f"{traceback.format_exc()}",
218
+ )
219
+ return
220
+
221
+ # Start the ReactPy component rendering loop
222
+ with contextlib.suppress(Exception):
223
+ await serve_layout(
224
+ Layout(ConnectionContext(root_component, value=connection)),
225
+ self.send_json,
226
+ self.recv_queue.get,
227
+ )
@@ -0,0 +1,15 @@
1
+ from django.urls import path
2
+
3
+ from reactpy_django.config import REACTPY_URL_PREFIX
4
+
5
+ from .consumer import ReactpyAsyncWebsocketConsumer
6
+
7
+ REACTPY_WEBSOCKET_ROUTE = path(
8
+ f"{REACTPY_URL_PREFIX}/<str:dotted_path>/<uuid:uuid>/<int:has_args>/",
9
+ ReactpyAsyncWebsocketConsumer.as_asgi(),
10
+ )
11
+ """A URL path for :class:`ReactpyAsyncWebsocketConsumer`.
12
+
13
+ Required since the `reverse()` function does not exist for Django Channels, but ReactPy needs
14
+ to know the current websocket path.
15
+ """
@@ -0,0 +1,9 @@
1
+ ## The MIT License (MIT)
2
+
3
+ #### Copyright (c) Reactive Python and affiliates.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,152 @@
1
+ Metadata-Version: 2.1
2
+ Name: reactpy_django
3
+ Version: 5.0.0
4
+ Summary: It's React, but in Python. Now with Django integration.
5
+ Home-page: https://github.com/reactive-python/reactpy-django
6
+ Author: Mark Bakhit
7
+ Author-email: archiethemonger@gmail.com
8
+ License: MIT
9
+ Keywords: interactive,reactive,widgets,DOM,React,ReactJS,ReactPy
10
+ Platform: Linux
11
+ Platform: Mac OS X
12
+ Platform: Windows
13
+ Classifier: Framework :: Django
14
+ Classifier: Framework :: Django :: 4.0
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Operating System :: OS Independent
20
+ Classifier: Intended Audience :: Developers
21
+ Classifier: Intended Audience :: Science/Research
22
+ Classifier: Topic :: Multimedia :: Graphics
23
+ Classifier: Environment :: Web Environment
24
+ Requires-Python: >=3.9
25
+ Description-Content-Type: text/markdown
26
+ License-File: LICENSE.md
27
+ Requires-Dist: channels>=4.0.0
28
+ Requires-Dist: django>=4.2.0
29
+ Requires-Dist: reactpy<1.1.0,>=1.0.2
30
+ Requires-Dist: reactpy-router<2.0.0,>=1.0.0
31
+ Requires-Dist: dill>=0.3.5
32
+ Requires-Dist: orjson>=3.6.0
33
+ Requires-Dist: nest-asyncio>=1.5.0
34
+ Requires-Dist: typing-extensions
35
+
36
+ # <img src="https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg" align="left" height="45"/> ReactPy-Django
37
+
38
+ <p>
39
+ <a href="https://github.com/reactive-python/reactpy-django/actions?query=workflow%3ATest">
40
+ <img src="https://github.com/reactive-python/reactpy-django/workflows/Test/badge.svg?event=push">
41
+ </a>
42
+ <a href="https://pypi.python.org/pypi/reactpy-django">
43
+ <img src="https://img.shields.io/pypi/v/reactpy-django.svg?label=PyPI">
44
+ </a>
45
+ <a href="https://github.com/reactive-python/reactpy-django/blob/main/LICENSE.md">
46
+ <img src="https://img.shields.io/badge/License-MIT-purple.svg">
47
+ </a>
48
+ <a href="https://reactive-python.github.io/reactpy-django/">
49
+ <img src="https://img.shields.io/website?down_message=offline&label=Docs&logo=read%20the%20docs&logoColor=white&up_message=online&url=https%3A%2F%2Freactive-python.github.io%2Freactpy-django%2F">
50
+ </a>
51
+ <a href="https://discord.gg/uNb5P4hA9X">
52
+ <img src="https://img.shields.io/discord/1111078259854168116?label=Discord&logo=discord">
53
+ </a>
54
+ </p>
55
+
56
+ [ReactPy-Django](https://github.com/reactive-python/reactpy-django) is used to add [ReactPy](https://reactpy.dev/) support to an existing **Django project**. This package also turbocharges ReactPy with features such as...
57
+
58
+ - [SEO compatible rendering](https://reactive-python.github.io/reactpy-django/latest/reference/settings/#reactpy_prerender)
59
+ - [Client-Side Python components](https://reactive-python.github.io/reactpy-django/latest/reference/template-tag/#pyscript-component)
60
+ - [Single page application (SPA) capabilities](https://reactive-python.github.io/reactpy-django/latest/reference/router/#django-router)
61
+ - [Distributed computing](https://reactive-python.github.io/reactpy-django/latest/reference/settings/#reactpy_default_hosts)
62
+ - [Performance enhancements](https://reactive-python.github.io/reactpy-django/latest/reference/settings/#performance-settings)
63
+ - [Customizable reconnection behavior](https://reactive-python.github.io/reactpy-django/latest/reference/settings/#stability-settings)
64
+ - [Customizable disconnection behavior](https://reactive-python.github.io/reactpy-django/latest/reference/template-tag)
65
+ - [Multiple root components](https://reactive-python.github.io/reactpy-django/latest/reference/template-tag/)
66
+ - [Cross-process communication/signaling (Channel Layers)](https://reactive-python.github.io/reactpy-django/latest/reference/hooks/#use-channel-layer)
67
+ - [Django view to ReactPy component conversion](https://reactive-python.github.io/reactpy-django/latest/reference/components/#view-to-component)
68
+ - [Django static file access](https://reactive-python.github.io/reactpy-django/latest/reference/components/#django-css)
69
+ - [Django database access](https://reactive-python.github.io/reactpy-django/latest/reference/hooks/#use-query)
70
+
71
+ ## What is ReactPy?
72
+
73
+ [ReactPy](https://reactpy.dev/) is a library for building user interfaces in Python without Javascript. ReactPy interfaces are made from components that look and behave similar to those found in [ReactJS](https://reactjs.org/). Designed with simplicity in mind, ReactPy can be used by those without web development experience while also being powerful enough to grow with your ambitions.
74
+
75
+ <table align="center">
76
+ <thead>
77
+ <tr>
78
+ <th colspan="2" style="text-align: center">Supported Backends</th>
79
+ <tr>
80
+ <th style="text-align: center">Built-in</th>
81
+ <th style="text-align: center">External</th>
82
+ </tr>
83
+ </thead>
84
+ <tbody>
85
+ <tr>
86
+ <td>
87
+ <a href="https://reactpy.dev/docs/guides/getting-started/installing-reactpy.html#officially-supported-servers">
88
+ Flask, FastAPI, Sanic, Tornado
89
+ </a>
90
+ </td>
91
+ <td>
92
+ <a href="https://github.com/reactive-python/reactpy-django">Django</a>,
93
+ <a href="https://github.com/reactive-python/reactpy-jupyter">Jupyter</a>,
94
+ <a href="https://github.com/idom-team/idom-dash">Plotly-Dash</a>
95
+ </td>
96
+ </tr>
97
+ </tbody>
98
+ </table>
99
+
100
+ # At a Glance
101
+
102
+ ## `my_app/components.py`
103
+
104
+ <!--py-header-start-->
105
+
106
+ You will need a file to define your [ReactPy](https://github.com/reactive-python/reactpy) components. We recommend creating a `components.py` file within your chosen **Django app** to start out. Within this file, we will create a simple `hello_world` component.
107
+
108
+ <!--py-header-end-->
109
+ <!--py-code-start-->
110
+
111
+ ```python
112
+ from reactpy import component, html
113
+
114
+ @component
115
+ def hello_world(recipient: str):
116
+ return html.h1(f"Hello {recipient}!")
117
+ ```
118
+
119
+ <!--py-code-end-->
120
+
121
+ ## [`my_app/templates/my_template.html`](https://docs.djangoproject.com/en/stable/topics/templates/)
122
+
123
+ <!--html-header-start-->
124
+
125
+ In your **Django app**'s HTML template, you can now embed your ReactPy component using the `component` template tag. Within this tag, you will need to type in the dotted path to the component.
126
+
127
+ Additionally, you can pass in `args` and `kwargs` into your component function. After reading the code below, pay attention to how the function definition for `hello_world` (_from the previous example_) accepts a `recipient` argument.
128
+
129
+ <!--html-code-start-->
130
+
131
+ ```jinja
132
+ {% load reactpy %}
133
+ <!DOCTYPE html>
134
+ <html>
135
+ <body>
136
+ {% component "example_project.my_app.components.hello_world" recipient="World" %}
137
+ </body>
138
+ </html>
139
+ ```
140
+
141
+ <!--html-code-end-->
142
+
143
+ # Resources
144
+
145
+ Follow the links below to find out more about this project.
146
+
147
+ - [Try ReactPy (Jupyter Notebook)](https://mybinder.org/v2/gh/reactive-python/reactpy-jupyter/main?urlpath=lab/tree/notebooks/introduction.ipynb)
148
+ - [Documentation](https://reactive-python.github.io/reactpy-django)
149
+ - [GitHub Discussions](https://github.com/reactive-python/reactpy-django/discussions)
150
+ - [Discord](https://discord.gg/uNb5P4hA9X)
151
+ - [Contributor Guide](https://reactive-python.github.io/reactpy-django/latest/about/code/)
152
+ - [Code of Conduct](https://github.com/reactive-python/reactpy-django/blob/main/CODE_OF_CONDUCT.md)
@@ -0,0 +1,118 @@
1
+ js/node_modules/@pyscript/core/src/stdlib/pyscript/__init__.py,sha256=ya-C1i746MtpzvyX6haAeg8VAE38enzwFE4PgKK1KdA,2242
2
+ js/node_modules/@pyscript/core/src/stdlib/pyscript/display.py,sha256=1T04pn-AqCyO3Z4-nyC51pr160VQ2uGEF8lgjbg_rfk,5343
3
+ js/node_modules/@pyscript/core/src/stdlib/pyscript/event_handling.py,sha256=M3LrXKQKGTiCWdZ6DGHuVeF5tqbFtvWuqbFfHzqOVHo,2380
4
+ js/node_modules/@pyscript/core/src/stdlib/pyscript/fetch.py,sha256=IOAKDBPSxk0KryNMO078a6N5LVzVbQY4AlDvSFE-X1M,2461
5
+ js/node_modules/@pyscript/core/src/stdlib/pyscript/ffi.py,sha256=HQym_RgAVIbp6ZkGAINXLAKsbPxs5EM3WCbCBziaGA8,432
6
+ js/node_modules/@pyscript/core/src/stdlib/pyscript/flatted.py,sha256=HRGT8tKdU0On9cCld2UBvOueUaLR_ju8wHW4-l_yH5g,3135
7
+ js/node_modules/@pyscript/core/src/stdlib/pyscript/magic_js.py,sha256=mxqpcLC6p0u72SyvF5-0IlaWdif-DWP4VpJUv3ucCcI,2317
8
+ js/node_modules/@pyscript/core/src/stdlib/pyscript/storage.py,sha256=vzH-ss7AwcsbMDAEJ_25lYwgE8vRBBG0u6-efOpuYRc,1758
9
+ js/node_modules/@pyscript/core/src/stdlib/pyscript/util.py,sha256=47qSdUQ5iNraLbm_o9TbCnJBi9nOINx9xLwyc4a_UFI,759
10
+ js/node_modules/@pyscript/core/src/stdlib/pyscript/web.py,sha256=2AC6c2VxmTgG60AE1i0VRgre332gVHyiYOT0pNrthv8,36735
11
+ js/node_modules/@pyscript/core/src/stdlib/pyscript/websocket.py,sha256=2ItPyB1srX95PNUhvjIKZZOJtgaIB67HKomcbbyQso4,1896
12
+ js/node_modules/@pyscript/core/src/stdlib/pyscript/workers.py,sha256=skLdXAIiuWWfShP0ZZsvrOPx4MIrqOOUWQTi1x0x8Kc,1002
13
+ js/node_modules/flatted/python/flatted.py,sha256=ke8FuEflns-WlphCcQ9CC0qJqWqX3zEEuak74o6rgE8,3879
14
+ js/node_modules/flatted/python/test.py,sha256=uTOn6HJd7KeY_PTRvvufv60dmvON3KWp3nnqACj8IlA,2129
15
+ js/node_modules/polyscript/python/mip.py,sha256=wy9u2RAzIlMLfoUxx6Bmvpi7UGsk8VD6AFVjYCrZmkM,8004
16
+ reactpy_django/__init__.py,sha256=PS-G6G46W6Oewx-pd1v1rq3EC37WzZO2HrDHnpbeTj0,712
17
+ reactpy_django/apps.py,sha256=kFnO9luEKN5QPHaTGmnZg087Aoahl4RJsiu-NoDuwuI,279
18
+ reactpy_django/checks.py,sha256=DSSHYMeaTJmXE60-7UgaKctfRbSNJARlzqCBvqiZE4Q,21798
19
+ reactpy_django/clean.py,sha256=4Ok30-5gmAJC_7OQTbH_oXFoaANmLdbEQhwLjIoYUxQ,4671
20
+ reactpy_django/components.py,sha256=mwmpMRcc5tAM-FVcbh4ym8k8gUzoKb7GDc29kVvcnaU,8987
21
+ reactpy_django/config.py,sha256=Ui_RBV7cX70jokyB0PHQC5uEio-7T7eUodxDdWKtR4g,3380
22
+ reactpy_django/database.py,sha256=B3V2uGn5zNJcBQETfKlMhi0qPrOg4hxc1Bn2iAlI1D0,1115
23
+ reactpy_django/decorators.py,sha256=LbZ0n-QxDr839yFsTf6GBr4IvGf4VjuDufJEFsz-R6g,2228
24
+ reactpy_django/exceptions.py,sha256=HDXMyvVDTQMetACFRy3TS4f-NPxBw261qgcgJX41FLE,476
25
+ reactpy_django/hooks.py,sha256=KaAogpYZDF7vVgO51-yri_Pd6tHCum3lWLFtES11olY,16841
26
+ reactpy_django/html.py,sha256=gw9ze5f9ISnqJDlNSQxj6kiXOM30XBoOdjy4eVORmfs,99
27
+ reactpy_django/models.py,sha256=W1k8nMqK_ihNaBeFan7FmFNHRjEVBl0myokyklgjX6Y,1711
28
+ reactpy_django/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
29
+ reactpy_django/types.py,sha256=ulzT_vLwMaGZp-jqWQY_tnlujIxSs5zLfvJaDrgKgkI,1875
30
+ reactpy_django/utils.py,sha256=vttijLT2KBL3gx_rKRE9TNxr7O-fvC4qCmg9PaVE-8s,19835
31
+ reactpy_django/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ reactpy_django/http/urls.py,sha256=jmho30KjrBNqS-mw__7IryvctTBPVhLEJOSOoLPkyPE,316
33
+ reactpy_django/http/views.py,sha256=2uYxF1te6cXaLTY7896q0L07CrUZSkAM4TFIw0iO61c,2460
34
+ reactpy_django/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ reactpy_django/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ reactpy_django/management/commands/clean_reactpy.py,sha256=o916_rSzmYa-_ov7KXL-_0jH6AGI_Z97M-AhdGpofxs,1234
37
+ reactpy_django/migrations/0001_initial.py,sha256=7oV8X85sZWkDSEIL9NicNhfBD8or1vuzC2ygesTitK4,648
38
+ reactpy_django/migrations/0002_rename_created_at_componentparams_last_accessed.py,sha256=j_VvXjuCIyTSnGMcN6uNwolJBf_roTCiZnVgLn2ROmo,378
39
+ reactpy_django/migrations/0003_componentsession_delete_componentparams.py,sha256=sQUNxM1EQwBVICcyUhcAL1gLLF_HrneYlYjpK43-am0,802
40
+ reactpy_django/migrations/0004_config.py,sha256=33I_cjO5Z3CBwijopTzehJfjawYFHMC5I0R5KbNq_ZA,735
41
+ reactpy_django/migrations/0005_alter_componentsession_last_accessed.py,sha256=X0pxB3MNpu_HSG180b1CZCUavVeUi5IQp1wGuXuEt0E,401
42
+ reactpy_django/migrations/0006_userdatamodel.py,sha256=cDh234dNmMQZWen705XlmkWUDdOEeUWme_MgI72aXGg,811
43
+ reactpy_django/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ reactpy_django/pyscript/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
+ reactpy_django/pyscript/component_template.py,sha256=_4r6s19uu__keAzaXINoXmiEacSomFcCIL70j3iQ_Dw,803
46
+ reactpy_django/pyscript/layout_handler.py,sha256=7142ZE2cNZlgQsZstn77hbAik_ZzrcsegqEMgA0IFBg,5401
47
+ reactpy_django/router/__init__.py,sha256=sYHiEtdY9fmOTRHXWLMB8R0yQrskVIg-gwaJiR0Aths,148
48
+ reactpy_django/router/converters.py,sha256=PQEMTC3JZvFNnZaFbJaMeJoimm269j6LEcNhmJPf3Lk,311
49
+ reactpy_django/router/resolvers.py,sha256=wjAC5Ai_hAnt9RYgGyZzzZ2l1fsFmYWkJdcVO0t_3BQ,650
50
+ reactpy_django/static/reactpy_django/client.js,sha256=_Hz-oZp8mV5HHv__lmV4BBYJG3JIyI-Bgn8qi8gZGZY,323629
51
+ reactpy_django/static/reactpy_django/pyscript-custom.css,sha256=AH8osdIh8ZANHe0Y4giV7l3ll21XwNv4ibMEi5jGlFA,33
52
+ reactpy_django/static/reactpy_django/pyscript-hide-debug.css,sha256=TSVmdOQVWwN-L9C0g0JmvvHoOfN4NlXvom0SXrIEmXg,33
53
+ reactpy_django/static/reactpy_django/morphdom/morphdom-esm.js,sha256=VJC9hiZz1ErmzNtvEd_MupoCJmIiHmNqoU2oqyVDwU4,28407
54
+ reactpy_django/static/reactpy_django/morphdom/morphdom-factory.js,sha256=e3G5q-fQHTArdxuGhyqidhiZLa1feW5TT_87TNWKYuM,26289
55
+ reactpy_django/static/reactpy_django/morphdom/morphdom-umd.js,sha256=dGCWTV2Lj-P-ttNLEwgLEkgNE3KM8lk4Q8hSPViKmc8,31367
56
+ reactpy_django/static/reactpy_django/morphdom/morphdom-umd.min.js,sha256=feEo1hd4FC9l3NfuAtbyoqLfoIa_UI0wg95LQuvkZMw,12165
57
+ reactpy_django/static/reactpy_django/morphdom/morphdom.js,sha256=LEW_J26lARrfr2qW2CKwn8DkPZTxcy9UX9kqjX7QV-Y,28424
58
+ reactpy_django/static/reactpy_django/pyscript/codemirror-BEtcgaoQ.js,sha256=0FJWO0oDU5E_tna4MgLBaf8dA48j3v-TQ2XsHs5mPc4,31269
59
+ reactpy_django/static/reactpy_django/pyscript/codemirror-BEtcgaoQ.js.map,sha256=qxhwk52d7tZFRlTGtyzsqkJz2KxqidzVDYP2ZATHOvU,133485
60
+ reactpy_django/static/reactpy_django/pyscript/codemirror_commands-DDxffOmd.js,sha256=0kYZ1XW5T5javUsXS8neCxS3cPJlkDL_ZIkBmi04-wQ,27305
61
+ reactpy_django/static/reactpy_django/pyscript/codemirror_commands-DDxffOmd.js.map,sha256=y_iay4KVCaxEkuv2X9TVBbGUkESBRmBPxxn-qmT6uZA,124071
62
+ reactpy_django/static/reactpy_django/pyscript/codemirror_lang-python-CnWnFqxD.js,sha256=JpM2plrUtcXGKI1WI_Zn3fr7RpVDNsE9VGM2NGUMlU8,70263
63
+ reactpy_django/static/reactpy_django/pyscript/codemirror_lang-python-CnWnFqxD.js.map,sha256=-Df0PqgciyAShhSxmf9_quWqHJdhQFJ3c6m-wEpn-b4,186736
64
+ reactpy_django/static/reactpy_django/pyscript/codemirror_language-CjmvX4ix.js,sha256=qjidsQeTQS2_kg_T4m_QS7DRooaxk8heMjmvh9c-pb0,64998
65
+ reactpy_django/static/reactpy_django/pyscript/codemirror_language-CjmvX4ix.js.map,sha256=dR4mcugY39ceifw_Z4xInje40e_S9uRkktxa3OpXonw,323815
66
+ reactpy_django/static/reactpy_django/pyscript/codemirror_state-D1qTXrff.js,sha256=WGQmEXPX7jzyEvwW_JO2Gfh9N7qCw1HqM8GBXFjdhbg,48148
67
+ reactpy_django/static/reactpy_django/pyscript/codemirror_state-D1qTXrff.js.map,sha256=qC3S7cLFhDVD17rN4ubjT-6ijtQsDAEqebTCdNUbBzI,229021
68
+ reactpy_django/static/reactpy_django/pyscript/codemirror_view-DVb8uYMr.js,sha256=gxMMF3NfVPLThIQuMKfuAHIPigiWjouYPcjeZ3bd-Ks,189757
69
+ reactpy_django/static/reactpy_django/pyscript/codemirror_view-DVb8uYMr.js.map,sha256=4fthSLqZ3YRAa2nUR3CiHfngR9-xYyOVTFtaZiSeVkU,765481
70
+ reactpy_django/static/reactpy_django/pyscript/core-CjO3FOKB.js,sha256=GWNIJ24WpX7ngJZqqifpmEPc9zSp21kEWVhLEh6xTVY,115335
71
+ reactpy_django/static/reactpy_django/pyscript/core-CjO3FOKB.js.map,sha256=UnH4HOwYt33okqJrNEf8_R1094uwAgcFP_huzDcxSa4,302803
72
+ reactpy_django/static/reactpy_django/pyscript/core.css,sha256=Vownnhg0Gr9AfK33NzLqbpooeBYRApTjJAvIGS0bvHE,1203
73
+ reactpy_django/static/reactpy_django/pyscript/core.js,sha256=O_phS7H4nAJ6lMKxQLMv_Syb0SHD1t32MwDZR9oC9S4,232
74
+ reactpy_django/static/reactpy_django/pyscript/core.js.map,sha256=bPWlTnjYM5VUPL0xxsF06yze-nqUhYcPJVB27Jrul64,88
75
+ reactpy_django/static/reactpy_django/pyscript/deprecations-manager-pFtn19mE.js,sha256=cjVXz9N8gyPQHDQ3cJAml17vWvOVkzgrvqxjeXdaSsM,427
76
+ reactpy_django/static/reactpy_django/pyscript/deprecations-manager-pFtn19mE.js.map,sha256=PemBL6JwEbpN7rxi54krJwN-DgrqiN-KXb_6y6ScOPE,1412
77
+ reactpy_django/static/reactpy_django/pyscript/error-tq-z48YI.js,sha256=pQd1ZPk3SIEOT1g4pjm3vdMNH_HQSerkWGPo5Bn8Wbw,655
78
+ reactpy_django/static/reactpy_django/pyscript/error-tq-z48YI.js.map,sha256=k8R_YqjTPSIuz2tccldgd9pQ3fR9R1HhhGTl6ctHxRw,2112
79
+ reactpy_django/static/reactpy_django/pyscript/index-S1Do43bx.js,sha256=Fy01BUcXLvsVQxJFFSHR1rsiuKds_pvOgC1aGv8pn04,34231
80
+ reactpy_django/static/reactpy_django/pyscript/index-S1Do43bx.js.map,sha256=Lt4fDsgqaOQayGqKKn9nDPk5Zn1grwB8sEFfR_SXGo4,142506
81
+ reactpy_django/static/reactpy_django/pyscript/mpy-DovD7Qjy.js,sha256=JJLVulN0mI9nYIgz6tee1h1ubkRAHUpogKlTX6TtMno,2801
82
+ reactpy_django/static/reactpy_django/pyscript/mpy-DovD7Qjy.js.map,sha256=RBSQDwQCOouSOr6G5HNGitx1qRtaIs-pbJdEfSvj0wU,13745
83
+ reactpy_django/static/reactpy_django/pyscript/py-BUsUWVJg.js,sha256=_DS-jCzCRkcZ3G0D8_S5QZBnbpITAxSG8tX88I2093A,2283
84
+ reactpy_django/static/reactpy_django/pyscript/py-BUsUWVJg.js.map,sha256=Df4KPebJc2QzBO78yRVzfVoaZTJr-oEqymWe0FbcpCA,9778
85
+ reactpy_django/static/reactpy_django/pyscript/py-editor-CeySmmer.js,sha256=_o_Oc0gvROOS4rYXRKe3riao1-SGt_jlf0mJ-hf4pro,6073
86
+ reactpy_django/static/reactpy_django/pyscript/py-editor-CeySmmer.js.map,sha256=TMuLti8TwBacVvhql92ymlB_rJkXPRrwJ19PJweOHUU,23223
87
+ reactpy_django/static/reactpy_django/pyscript/py-terminal-CH_wV7wQ.js,sha256=juuKNfwmDlRjAvZRy94nqQMLAOIjWPJqTbgBaf2gHDE,757
88
+ reactpy_django/static/reactpy_django/pyscript/py-terminal-CH_wV7wQ.js.map,sha256=MbHY5qhqeGccPvkgwdPxHaMHQEe2iGVF1W42LqHfOm4,3241
89
+ reactpy_django/static/reactpy_django/pyscript/storage.js,sha256=Ik2dirMv-arrknlFyFCNr_iKSMFFGzziOXje4PJ4aYw,4073
90
+ reactpy_django/static/reactpy_django/pyscript/storage.js.map,sha256=hIWwVNbFAhJbKCrsEA-sQV4I-KqD1GLmyFYCcwnz6Tc,22289
91
+ reactpy_django/static/reactpy_django/pyscript/toml-CvAfdf9_.js,sha256=NhWXw5cveZa6Jf-yyzPFQvWl7hOrn9Yz6dSOAP4QdOc,21511
92
+ reactpy_django/static/reactpy_django/pyscript/toml-CvAfdf9_.js.map,sha256=caEzuunBnHlU-WyhRMOc6liQcTKuvCYMKORq0iLTRIU,59238
93
+ reactpy_django/static/reactpy_django/pyscript/toml-DiUM0_qs.js,sha256=FdD6o9g4DQkOsoOGYbH9kbuJ-uAz6qr6qaPfhmvqRzY,995
94
+ reactpy_django/static/reactpy_django/pyscript/toml-DiUM0_qs.js.map,sha256=gHhB_E-l-ZcKVMniFmfvDUp47UqXjcSB1pyZRSQmcns,5004
95
+ reactpy_django/static/reactpy_django/pyscript/xterm-BY7uk_OU.js,sha256=Z2yQHceKHv5yPaHRzMvzrLnVe4owcACD1L6m8KrTGsE,283254
96
+ reactpy_django/static/reactpy_django/pyscript/xterm-BY7uk_OU.js.map,sha256=m1fugalIf9zQDugBRvA4eIjKyQgeaYJOPgxvR8DYRDM,624630
97
+ reactpy_django/static/reactpy_django/pyscript/xterm-readline-CZfBw7ic.js,sha256=Uun-qSnDzTblZP0DHOf5PsD9qCv6IWlBQBrLGdiCqtE,33694
98
+ reactpy_django/static/reactpy_django/pyscript/xterm-readline-CZfBw7ic.js.map,sha256=pghVxY7FSJTSkBxOEzdYeGhg9rYYfF5dPsQ93wd1opc,72561
99
+ reactpy_django/static/reactpy_django/pyscript/xterm.css,sha256=4AXxkwnABKJxyFM_b-LrGpKbolsmaV19_za86egfOY0,2621
100
+ reactpy_django/static/reactpy_django/pyscript/xterm_addon-fit--gyF3PcZ.js,sha256=kDBreljehlFf1wQoGADw4dcqyXGviO_pB7Cj0vgzivo,1387
101
+ reactpy_django/static/reactpy_django/pyscript/xterm_addon-fit--gyF3PcZ.js.map,sha256=Ad3d5v5HaxD5QEj-lsnX4QvKLG-jvPJTPJ9jRqgaRZo,3481
102
+ reactpy_django/static/reactpy_django/pyscript/xterm_addon-web-links-Cnej-nJ6.js,sha256=S6D9ZNfmrMoeQFhl4sfa2RVLCFDsIa2_Q5Dq2lNH9gw,3010
103
+ reactpy_django/static/reactpy_django/pyscript/xterm_addon-web-links-Cnej-nJ6.js.map,sha256=4dV4a66zv9TqawoaC5e5wJPls5Cm4tkRkXKyunL9GVA,7950
104
+ reactpy_django/static/reactpy_django/pyscript/zip-DrwYHuF9.js,sha256=yUK1F-ujlIvBOO-tOPxuhoJO_6D12X9O2DJk8R-8PbE,171871
105
+ reactpy_django/static/reactpy_django/pyscript/zip-DrwYHuF9.js.map,sha256=ISe_NxcZfAIDol6ksB3zHJZg92ClAE6nCozWxJJiUlg,354093
106
+ reactpy_django/templates/reactpy/component.html,sha256=GMdhL_AHQhq_3hycHMiqWg2uZCVD1sUWdZp5BUqPciY,1201
107
+ reactpy_django/templates/reactpy/pyscript_component.html,sha256=g1TUUAjhxRFQfhB6rL7vO7WaQLFklFPncZolxgIg2Lc,167
108
+ reactpy_django/templates/reactpy/pyscript_setup.html,sha256=boJMvPZ_hmn9PTHo2DOu-CtTdRaACxVH0Y6yWyzC11s,514
109
+ reactpy_django/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
+ reactpy_django/templatetags/reactpy.py,sha256=Mh7MmRV9NAXfVXuw3exSu-01xfumx7TNsV8V551IuvE,9457
111
+ reactpy_django/websocket/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
+ reactpy_django/websocket/consumer.py,sha256=9vF_OfTVGp4_XAFWzGyaponWIywwA7Hh_fxM5TmLLo4,8441
113
+ reactpy_django/websocket/paths.py,sha256=oa9g2ldDz7nqyh5i-luHdBWaq4rmgWbDwieP8S9pMqM,484
114
+ reactpy_django-5.0.0.dist-info/LICENSE.md,sha256=3X8Yi_UBFeSYAEJzKlwLRyiROzolmO7NOy6NXpTs_H8,1101
115
+ reactpy_django-5.0.0.dist-info/METADATA,sha256=yCbHmfsQXhpAUd_mVnA1JNp6JV6fukg35kK82Cq-xvA,7303
116
+ reactpy_django-5.0.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
117
+ reactpy_django-5.0.0.dist-info/top_level.txt,sha256=H5UQq1TZo4mOoKE7rJ5VLosnT0Ys5NEusvDWuaaYcJQ,18
118
+ reactpy_django-5.0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (75.2.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ js
2
+ reactpy_django