19
19
20
20
21
21
@component
22
- def session_manager (child : Any ):
22
+ def root_manager (child : Any ):
23
+ scope = hooks .use_connection ().scope
24
+ _ , set_rerender = hooks .use_state (uuid4 )
25
+
26
+ @hooks .use_effect (dependencies = [])
27
+ def setup_asgi_scope ():
28
+ """Store trigger functions in the websocket scope so that ReactPy-Django's hooks can command
29
+ any relevant actions."""
30
+ scope ["reactpy" ]["rerender" ] = rerender
31
+
32
+ async def rerender ():
33
+ """Event that can force a rerender of the entire component tree."""
34
+ set_rerender (uuid4 ())
35
+
36
+ return child
37
+
38
+
39
+ @component
40
+ def session_manager ():
23
41
"""This component can force the client (browser) to switch HTTP sessions,
24
42
making it match the websocket session.
25
43
26
44
Used to force persistent authentication between Django's websocket and HTTP stack."""
27
45
from reactpy_django import config
28
46
29
47
synchronize_requested , set_synchronize_requested = hooks .use_state (False )
30
- _ , set_rerender = hooks .use_state (uuid4 )
31
48
uuid = hooks .use_ref ("" )
32
49
scope = hooks .use_connection ().scope
33
50
34
51
@hooks .use_effect (dependencies = [])
35
52
def setup_asgi_scope ():
36
53
"""Store trigger functions in the websocket scope so that ReactPy-Django's hooks can command
37
54
any relevant actions."""
38
- scope .setdefault ("reactpy" , {})
39
55
scope ["reactpy" ]["synchronize_session" ] = synchronize_session
40
- scope ["reactpy" ]["rerender" ] = rerender
41
56
42
57
@hooks .use_effect (dependencies = [synchronize_requested ])
43
58
async def synchronize_session_watchdog ():
@@ -86,15 +101,10 @@ async def synchronize_session_callback(status_code: int, response: str):
86
101
f"Client returned unexpected HTTP status code ({ status_code } ) while trying to sychronize sessions." ,
87
102
)
88
103
89
- async def rerender ():
90
- """Event that can force a rerender of the entire component tree."""
91
- set_rerender (uuid4 ())
92
-
93
104
# If needed, synchronize sessions by configuring all relevant session cookies.
94
105
# This is achieved by commanding the client to perform a HTTP request to our session manager endpoint.
95
- http_request = None
96
106
if synchronize_requested :
97
- http_request = HttpRequest (
107
+ return HttpRequest (
98
108
{
99
109
"method" : "GET" ,
100
110
"url" : reverse ("reactpy:session_manager" , args = [uuid .current ]),
@@ -103,4 +113,4 @@ async def rerender():
103
113
},
104
114
)
105
115
106
- return html . _ ( child , http_request )
116
+ return None
0 commit comments