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.
- js/node_modules/@pyscript/core/src/stdlib/pyscript/__init__.py +61 -0
- js/node_modules/@pyscript/core/src/stdlib/pyscript/display.py +177 -0
- js/node_modules/@pyscript/core/src/stdlib/pyscript/event_handling.py +76 -0
- js/node_modules/@pyscript/core/src/stdlib/pyscript/fetch.py +87 -0
- js/node_modules/@pyscript/core/src/stdlib/pyscript/ffi.py +18 -0
- js/node_modules/@pyscript/core/src/stdlib/pyscript/flatted.py +148 -0
- js/node_modules/@pyscript/core/src/stdlib/pyscript/magic_js.py +79 -0
- js/node_modules/@pyscript/core/src/stdlib/pyscript/storage.py +60 -0
- js/node_modules/@pyscript/core/src/stdlib/pyscript/util.py +33 -0
- js/node_modules/@pyscript/core/src/stdlib/pyscript/web.py +1176 -0
- js/node_modules/@pyscript/core/src/stdlib/pyscript/websocket.py +71 -0
- js/node_modules/@pyscript/core/src/stdlib/pyscript/workers.py +43 -0
- js/node_modules/flatted/python/flatted.py +149 -0
- js/node_modules/flatted/python/test.py +63 -0
- js/node_modules/polyscript/python/mip.py +288 -0
- reactpy_django/__init__.py +32 -0
- reactpy_django/apps.py +11 -0
- reactpy_django/checks.py +558 -0
- reactpy_django/clean.py +141 -0
- reactpy_django/components.py +284 -0
- reactpy_django/config.py +128 -0
- reactpy_django/database.py +31 -0
- reactpy_django/decorators.py +65 -0
- reactpy_django/exceptions.py +34 -0
- reactpy_django/hooks.py +469 -0
- reactpy_django/html.py +3 -0
- reactpy_django/http/__init__.py +0 -0
- reactpy_django/http/urls.py +18 -0
- reactpy_django/http/views.py +62 -0
- reactpy_django/management/__init__.py +0 -0
- reactpy_django/management/commands/__init__.py +0 -0
- reactpy_django/management/commands/clean_reactpy.py +37 -0
- reactpy_django/migrations/0001_initial.py +25 -0
- reactpy_django/migrations/0002_rename_created_at_componentparams_last_accessed.py +17 -0
- reactpy_django/migrations/0003_componentsession_delete_componentparams.py +28 -0
- reactpy_django/migrations/0004_config.py +27 -0
- reactpy_django/migrations/0005_alter_componentsession_last_accessed.py +17 -0
- reactpy_django/migrations/0006_userdatamodel.py +28 -0
- reactpy_django/migrations/__init__.py +0 -0
- reactpy_django/models.py +48 -0
- reactpy_django/py.typed +1 -0
- reactpy_django/pyscript/__init__.py +0 -0
- reactpy_django/pyscript/component_template.py +26 -0
- reactpy_django/pyscript/layout_handler.py +139 -0
- reactpy_django/router/__init__.py +5 -0
- reactpy_django/router/converters.py +8 -0
- reactpy_django/router/resolvers.py +22 -0
- reactpy_django/static/reactpy_django/client.js +1 -0
- reactpy_django/static/reactpy_django/morphdom/morphdom-esm.js +769 -0
- reactpy_django/static/reactpy_django/morphdom/morphdom-factory.js +705 -0
- reactpy_django/static/reactpy_django/morphdom/morphdom-umd.js +777 -0
- reactpy_django/static/reactpy_django/morphdom/morphdom-umd.min.js +1 -0
- reactpy_django/static/reactpy_django/morphdom/morphdom.js +771 -0
- reactpy_django/static/reactpy_django/pyscript/codemirror-BEtcgaoQ.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/codemirror-BEtcgaoQ.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/codemirror_commands-DDxffOmd.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/codemirror_commands-DDxffOmd.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/codemirror_lang-python-CnWnFqxD.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/codemirror_lang-python-CnWnFqxD.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/codemirror_language-CjmvX4ix.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/codemirror_language-CjmvX4ix.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/codemirror_state-D1qTXrff.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/codemirror_state-D1qTXrff.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/codemirror_view-DVb8uYMr.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/codemirror_view-DVb8uYMr.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/core-CjO3FOKB.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/core-CjO3FOKB.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/core.css +1 -0
- reactpy_django/static/reactpy_django/pyscript/core.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/core.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/deprecations-manager-pFtn19mE.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/deprecations-manager-pFtn19mE.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/error-tq-z48YI.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/error-tq-z48YI.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/index-S1Do43bx.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/index-S1Do43bx.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/mpy-DovD7Qjy.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/mpy-DovD7Qjy.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/py-BUsUWVJg.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/py-BUsUWVJg.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/py-editor-CeySmmer.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/py-editor-CeySmmer.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/py-terminal-CH_wV7wQ.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/py-terminal-CH_wV7wQ.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/storage.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/storage.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/toml-CvAfdf9_.js +3 -0
- reactpy_django/static/reactpy_django/pyscript/toml-CvAfdf9_.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/toml-DiUM0_qs.js +3 -0
- reactpy_django/static/reactpy_django/pyscript/toml-DiUM0_qs.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/xterm-BY7uk_OU.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/xterm-BY7uk_OU.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/xterm-readline-CZfBw7ic.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/xterm-readline-CZfBw7ic.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/xterm.css +7 -0
- reactpy_django/static/reactpy_django/pyscript/xterm_addon-fit--gyF3PcZ.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/xterm_addon-fit--gyF3PcZ.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/xterm_addon-web-links-Cnej-nJ6.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/xterm_addon-web-links-Cnej-nJ6.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript/zip-DrwYHuF9.js +2 -0
- reactpy_django/static/reactpy_django/pyscript/zip-DrwYHuF9.js.map +1 -0
- reactpy_django/static/reactpy_django/pyscript-custom.css +3 -0
- reactpy_django/static/reactpy_django/pyscript-hide-debug.css +3 -0
- reactpy_django/templates/reactpy/component.html +27 -0
- reactpy_django/templates/reactpy/pyscript_component.html +2 -0
- reactpy_django/templates/reactpy/pyscript_setup.html +8 -0
- reactpy_django/templatetags/__init__.py +0 -0
- reactpy_django/templatetags/reactpy.py +250 -0
- reactpy_django/types.py +81 -0
- reactpy_django/utils.py +560 -0
- reactpy_django/websocket/__init__.py +0 -0
- reactpy_django/websocket/consumer.py +227 -0
- reactpy_django/websocket/paths.py +15 -0
- reactpy_django-5.0.0.dist-info/LICENSE.md +9 -0
- reactpy_django-5.0.0.dist-info/METADATA +152 -0
- reactpy_django-5.0.0.dist-info/RECORD +118 -0
- reactpy_django-5.0.0.dist-info/WHEEL +5 -0
- 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,,
|