Skip to content

Commit 6f79c4c

Browse files
authored
view_to_iframe component (#188)
- The `compatibility` argument on `reactpy_django.components.view_to_component` is deprecated. - Using `reactpy_django.components.view_to_component` as a decorator is deprecated. - `reactpy_django.utils.register_iframe` function has been added. - `reactpy_django.components.view_to_iframe` component has been added - It is now recommended to call `as_view()` when using `view_to_component` or `view_to_iframe` with Class Based Views. - Thread sensitivity has been enabled in all locations where ORM queries are possible.
1 parent 67dc1eb commit 6f79c4c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+814
-416
lines changed

CHANGELOG.md

+9
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,19 @@ Using the following categories, list your changes in this order:
3939
- ReactPy components can now use SEO compatible rendering!
4040
- `settings.py:REACTPY_PRERENDER` can be set to `True` to enable this behavior by default
4141
- Or, you can enable it on individual components via the template tag: `{% component "..." prerender="True" %}`
42+
- `reactpy_django.components.view_to_iframe` component has been added, which uses an `<iframe>` to render a Django view.
43+
- `reactpy_django.utils.register_iframe` function has been added, which is mandatory to use alongside `reactpy_django.components.view_to_iframe`.
4244

4345
### Changed
4446

4547
- Renamed undocumented utility function `reactpy_django.utils.ComponentPreloader` to `reactpy_django.utils.RootComponentFinder`.
48+
- It is now recommended to call `as_view()` when using `view_to_component` or `view_to_iframe` with Class Based Views.
49+
- Thread sensitivity has been enabled in all locations where ORM queries are possible.
50+
51+
### Deprecated
52+
53+
- The `compatibility` argument on `reactpy_django.components.view_to_component` is deprecated. Use `reactpy_django.components.view_to_iframe` instead.
54+
- Using `reactpy_django.components.view_to_component` as a decorator is deprecated. Check the docs on the new suggested usage.
4655

4756
## [3.5.1] - 2023-09-07
4857

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from django.apps import AppConfig
2+
from reactpy_django.utils import register_iframe
3+
4+
from . import views
5+
6+
7+
class ExampleAppConfig(AppConfig):
8+
name = "example"
9+
10+
def ready(self):
11+
register_iframe(views.HelloWorld)
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from django.apps import AppConfig
2+
from reactpy_django.utils import register_iframe
3+
4+
from . import views
5+
6+
7+
class ExampleAppConfig(AppConfig):
8+
name = "example"
9+
10+
def ready(self):
11+
register_iframe(views.hello_world)
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.http import HttpResponse
2+
3+
4+
def hello_world(request, arg1, arg2, kwarg1=None, kwarg2=None):
5+
return HttpResponse(f"Hello World! {arg1} {arg2} {kwarg1} {kwarg2}")

docs/python/hello_world_cbv.py

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from django.http import HttpResponse
2+
from django.views import View
3+
4+
5+
class HelloWorld(View):
6+
def get(self, request):
7+
return HttpResponse("Hello World!")

docs/python/hello_world_fbv.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.http import HttpResponse
2+
3+
4+
def hello_world(request):
5+
return HttpResponse("Hello World!")
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.http import HttpResponse
2+
3+
4+
def hello_world(request):
5+
return HttpResponse('<div id="hello-world"> Hello World! </div>')

docs/python/register-component.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
from reactpy_django.utils import register_component
33

44

5-
class ExampleConfig(AppConfig):
5+
class ExampleAppConfig(AppConfig):
6+
name = "example"
7+
68
def ready(self):
7-
# Add components to the ReactPy component registry when Django is ready
89
register_component("example_project.my_app.components.hello_world")

docs/python/use-mutation-thread-sensitive.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from reactpy_django.types import MutationOptions
44

55

6-
def execute_thread_safe_mutation():
6+
def execute_thread_safe_mutation(text):
77
"""This is an example mutation function that does some thread-safe operation."""
88
pass
99

docs/python/views.py

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from .hello_world_cbv import HelloWorld
2+
from .hello_world_fbv import hello_world
3+
4+
__all__ = [
5+
"HelloWorld",
6+
"hello_world",
7+
]

docs/python/vtc-args-kwargs.py

-21
This file was deleted.

docs/python/vtc-args.py

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from django.http import HttpRequest
2+
from reactpy import component, html
3+
from reactpy_django.components import view_to_component
4+
5+
from . import views
6+
7+
hello_world_component = view_to_component(views.hello_world)
8+
9+
10+
@component
11+
def my_component():
12+
request = HttpRequest()
13+
request.method = "GET"
14+
15+
return html.div(
16+
hello_world_component(
17+
request, # This request object is optional.
18+
"value_1",
19+
"value_2",
20+
kwarg1="abc",
21+
kwarg2="123",
22+
),
23+
)

docs/python/vtc-cbv-compatibility.py

-10
This file was deleted.

docs/python/vtc-cbv.py

+3-9
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,13 @@
1-
from django.http import HttpResponse
2-
from django.views import View
31
from reactpy import component, html
42
from reactpy_django.components import view_to_component
53

4+
from . import views
65

7-
class HelloWorldView(View):
8-
def get(self, request):
9-
return HttpResponse("Hello World!")
10-
11-
12-
vtc = view_to_component(HelloWorldView)
6+
hello_world_component = view_to_component(views.HelloWorld.as_view())
137

148

159
@component
1610
def my_component():
1711
return html.div(
18-
vtc(),
12+
hello_world_component(),
1913
)

docs/python/vtc-compatibility.py

-15
This file was deleted.

docs/python/vtc-fbv-compat.py

-8
This file was deleted.

docs/python/vtc-func.py

-12
This file was deleted.

docs/python/vtc-request.py

-20
This file was deleted.

docs/python/vtc-strict-parsing.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
from django.http import HttpResponse
21
from reactpy import component, html
32
from reactpy_django.components import view_to_component
43

4+
from . import views
55

6-
@view_to_component(strict_parsing=False)
7-
def hello_world_view(request):
8-
return HttpResponse("<my-tag> Hello World </my-tag>")
6+
hello_world_component = view_to_component(views.hello_world)
97

108

119
@component
1210
def my_component():
1311
return html.div(
14-
hello_world_view(),
12+
hello_world_component(),
1513
)

docs/python/vtc-transforms.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1-
from django.http import HttpResponse
21
from reactpy import component, html
32
from reactpy_django.components import view_to_component
43

4+
from . import views
5+
56

67
def example_transform(vdom):
78
attributes = vdom.get("attributes")
89
if attributes and attributes.get("id") == "hello-world":
9-
vdom["children"][0] = "Good Bye World!"
10+
vdom["children"][0] = "Farewell World!"
1011

1112

12-
@view_to_component(transforms=[example_transform])
13-
def hello_world_view(request):
14-
return HttpResponse("<div id='hello-world'> Hello World! <div>")
13+
hello_world_component = view_to_component(
14+
views.hello_world, transforms=[example_transform]
15+
)
1516

1617

1718
@component
1819
def my_component():
1920
return html.div(
20-
hello_world_view(),
21+
hello_world_component(),
2122
)

docs/python/vtc.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
from django.http import HttpResponse
21
from reactpy import component, html
32
from reactpy_django.components import view_to_component
43

4+
from . import views
55

6-
@view_to_component
7-
def hello_world_view(request):
8-
return HttpResponse("Hello World!")
6+
hello_world_component = view_to_component(views.hello_world)
97

108

119
@component
1210
def my_component():
1311
return html.div(
14-
hello_world_view(),
12+
hello_world_component(),
1513
)

docs/python/vti-args.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from reactpy import component, html
2+
from reactpy_django.components import view_to_iframe
3+
4+
from . import views
5+
6+
hello_world_iframe = view_to_iframe(
7+
views.hello_world,
8+
)
9+
10+
11+
@component
12+
def my_component():
13+
return html.div(
14+
hello_world_iframe(
15+
"value_1",
16+
"value_2",
17+
kwarg1="abc",
18+
kwarg2="123",
19+
),
20+
)

docs/python/vti-cbv.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from reactpy import component, html
2+
from reactpy_django.components import view_to_iframe
3+
4+
from . import views
5+
6+
hello_world_iframe = view_to_iframe(views.HelloWorld.as_view())
7+
8+
9+
@component
10+
def my_component():
11+
return html.div(
12+
hello_world_iframe(),
13+
)

docs/python/vti-extra-props.py

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from reactpy import component, html
2+
from reactpy_django.components import view_to_iframe
3+
4+
from . import views
5+
6+
hello_world_iframe = view_to_iframe(
7+
views.hello_world, extra_props={"title": "Hello World!"}
8+
)
9+
10+
11+
@component
12+
def my_component():
13+
return html.div(
14+
hello_world_iframe(),
15+
)

docs/python/vti.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from reactpy import component, html
2+
from reactpy_django.components import view_to_iframe
3+
4+
from . import views
5+
6+
hello_world_iframe = view_to_iframe(views.hello_world)
7+
8+
9+
@component
10+
def my_component():
11+
return html.div(
12+
hello_world_iframe(),
13+
)

0 commit comments

Comments
 (0)