Skip to content

Commit cfde802

Browse files
committed
Use ensure_async instead of database_sync_to_async
1 parent 5596d8d commit cfde802

File tree

4 files changed

+17
-37
lines changed

4 files changed

+17
-37
lines changed

src/reactpy_django/forms/components.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from typing import TYPE_CHECKING, Any, Callable, Union, cast
55
from uuid import uuid4
66

7-
from channels.db import database_sync_to_async
87
from django.forms import Form, ModelForm
98
from reactpy import component, hooks, html, utils
109
from reactpy.core.events import event
@@ -79,7 +78,7 @@ def _django_form(
7978
async def render_form():
8079
"""Forms must be rendered in an async loop to allow database fields to execute."""
8180
if submitted_data:
82-
await database_sync_to_async(initialized_form.full_clean)()
81+
await ensure_async(initialized_form.full_clean, thread_sensitive=thread_sensitive)()
8382
success = not initialized_form.errors.as_data()
8483
if success and on_success:
8584
await ensure_async(on_success, thread_sensitive=thread_sensitive)(form_event)

src/reactpy_django/hooks.py

+8-22
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
import orjson
1616
from channels import DEFAULT_CHANNEL_LAYER
17-
from channels.db import database_sync_to_async
1817
from channels.layers import InMemoryChannelLayer, get_channel_layer
1918
from reactpy import use_callback, use_effect, use_memo, use_ref, use_state
2019
from reactpy import use_connection as _use_connection
@@ -34,7 +33,7 @@
3433
SyncPostprocessor,
3534
UserData,
3635
)
37-
from reactpy_django.utils import django_query_postprocessor, generate_obj_name, get_pk
36+
from reactpy_django.utils import django_query_postprocessor, ensure_async, generate_obj_name, get_pk
3837

3938
if TYPE_CHECKING:
4039
from collections.abc import Awaitable, Sequence
@@ -138,19 +137,13 @@ async def execute_query() -> None:
138137
"""The main running function for `use_query`"""
139138
try:
140139
# Run the query
141-
if asyncio.iscoroutinefunction(query):
142-
new_data = await query(**kwargs)
143-
else:
144-
new_data = await database_sync_to_async(query, thread_sensitive=thread_sensitive)(**kwargs)
140+
new_data = await ensure_async(query, thread_sensitive=thread_sensitive)(**kwargs)
145141

146142
# Run the postprocessor
147143
if postprocessor:
148-
if asyncio.iscoroutinefunction(postprocessor):
149-
new_data = await postprocessor(new_data, **postprocessor_kwargs)
150-
else:
151-
new_data = await database_sync_to_async(postprocessor, thread_sensitive=thread_sensitive)(
152-
new_data, **postprocessor_kwargs
153-
)
144+
new_data = await ensure_async(postprocessor, thread_sensitive=thread_sensitive)(
145+
new_data, **postprocessor_kwargs
146+
)
154147

155148
# Log any errors and set the error state
156149
except Exception as e:
@@ -240,12 +233,7 @@ def use_mutation(
240233
async def execute_mutation(exec_args, exec_kwargs) -> None:
241234
# Run the mutation
242235
try:
243-
if asyncio.iscoroutinefunction(mutation):
244-
should_refetch = await mutation(*exec_args, **exec_kwargs)
245-
else:
246-
should_refetch = await database_sync_to_async(mutation, thread_sensitive=thread_sensitive)(
247-
*exec_args, **exec_kwargs
248-
)
236+
should_refetch = await ensure_async(mutation, thread_sensitive=thread_sensitive)(*exec_args, **exec_kwargs)
249237

250238
# Log any errors and set the error state
251239
except Exception as e:
@@ -444,10 +432,8 @@ async def _get_user_data(user: AbstractUser, default_data: None | dict, save_def
444432
for key, value in default_data.items():
445433
if key not in data:
446434
new_value: Any = value
447-
if asyncio.iscoroutinefunction(value):
448-
new_value = await value()
449-
elif callable(value):
450-
new_value = value()
435+
if callable(value):
436+
new_value = await ensure_async(value)()
451437
data[key] = new_value
452438
changed = True
453439
if changed:

src/reactpy_django/utils.py

+5-10
Original file line numberDiff line numberDiff line change
@@ -82,17 +82,12 @@ async def render_view(
8282
if getattr(view, "as_view", None):
8383
view = view.as_view()
8484

85-
# Async function view
86-
if iscoroutinefunction(view):
87-
response = await view(request, *args, **kwargs)
85+
# Sync/Async function view
86+
response = await ensure_async(view)(request, *args, **kwargs)
8887

89-
# Sync function view
90-
else:
91-
response = await database_sync_to_async(view)(request, *args, **kwargs)
92-
93-
# TemplateView
88+
# TemplateView needs an extra render step
9489
if getattr(response, "render", None):
95-
response = await database_sync_to_async(response.render)()
90+
response = await ensure_async(response.render)()
9691

9792
return response
9893

@@ -565,7 +560,7 @@ def ensure_async(
565560
def wrapper(*args, **kwargs):
566561
return (
567562
func(*args, **kwargs)
568-
if inspect.iscoroutinefunction(func)
563+
if iscoroutinefunction(func)
569564
else database_sync_to_async(func, thread_sensitive=thread_sensitive)(*args, **kwargs)
570565
)
571566

src/reactpy_django/websocket/consumer.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import dill
1515
import orjson
1616
from channels.auth import login
17-
from channels.db import database_sync_to_async
1817
from channels.generic.websocket import AsyncJsonWebsocketConsumer
1918
from django.utils import timezone
2019
from reactpy.backend.hooks import ConnectionContext
@@ -23,6 +22,7 @@
2322
from reactpy.core.serve import serve_layout
2423

2524
from reactpy_django.clean import clean
25+
from reactpy_django.utils import ensure_async
2626

2727
if TYPE_CHECKING:
2828
from collections.abc import MutableMapping, Sequence
@@ -80,7 +80,7 @@ async def connect(self) -> None:
8080
f"ReactPy websocket authentication has failed!\n{traceback.format_exc()}",
8181
)
8282
try:
83-
await database_sync_to_async(self.scope["session"].save)()
83+
await ensure_async(self.scope["session"].save)()
8484
except Exception:
8585
await asyncio.to_thread(
8686
_logger.error,
@@ -116,7 +116,7 @@ async def disconnect(self, code: int) -> None:
116116
# Queue a cleanup, if needed
117117
if REACTPY_CLEAN_INTERVAL is not None:
118118
try:
119-
await database_sync_to_async(clean)()
119+
await ensure_async(clean)()
120120
except Exception:
121121
await asyncio.to_thread(
122122
_logger.error,

0 commit comments

Comments
 (0)