rx.call_script: a real EventHandler to execute arbitrary javascript (#1860)

This commit is contained in:
Masen Furer 2023-09-27 18:27:48 -07:00 committed by GitHub
parent 41872dfdc9
commit 991c7202a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 0 deletions

View File

@ -182,6 +182,15 @@ export const applyEvent = async (event, socket) => {
return false;
}
if (event.name == "_call_script") {
try {
eval(event.payload.javascript_code);
} catch(e) {
console.log("_call_script", e);
}
return false;
}
// Update token and router data (if missing).
event.token = getToken()
if (event.router_data === undefined || Object.keys(event.router_data).length === 0) {

View File

@ -22,6 +22,7 @@ from .event import EVENT_ARG as EVENT_ARG
from .event import EventChain as EventChain
from .event import FileUpload as upload_files
from .event import background as background
from .event import call_script as call_script
from .event import clear_local_storage as clear_local_storage
from .event import console_log as console_log
from .event import download as download

View File

@ -8,6 +8,7 @@ from typing import Any, Union
from reflex.components.component import Component
from reflex.event import EventChain
from reflex.utils import console
from reflex.vars import BaseVar, Var
@ -87,4 +88,10 @@ def client_side(javascript_code) -> Var[EventChain]:
An EventChain, passable to any component, that will execute the client side javascript
when triggered.
"""
console.deprecate(
feature_name="rx.client_side",
reason="Replaced by rx.call_script, which can be used from backend EventHandler too",
deprecation_version="0.2.9",
removal_version="0.2.10",
)
return BaseVar(name=f"...args => {{{javascript_code}}}", type_=EventChain)

View File

@ -443,6 +443,22 @@ def download(url: str, filename: Optional[str] = None) -> EventSpec:
)
def call_script(javascript_code: str) -> EventSpec:
"""Create an event handler that executes arbitrary javascript code.
Args:
javascript_code: The code to execute.
Returns:
EventSpec: An event that will execute the client side javascript.
"""
return server_side(
"_call_script",
get_fn_signature(call_script),
javascript_code=javascript_code,
)
def get_event(state, event):
"""Get the event from the given state.