Releases: reflex-dev/reflex
v0.5.2
New Features
Lifespan Tasks
A lifespan task is either a coroutine which runs while the backend server is running and is cancelled when the server stops, or it can be an asynccontextmanager
in which case it will run at server startup until yield
is called, then it will resume as the server is shutting down. In either case, the task is started and stopped during hot reload.
Any keyword arguments passed to app.register_lifespan_task
will be passed to the coroutine/contextmanager. If the coroutine takes a parameter called app
, this will be an instance of the underlying FastAPI object.
import asyncio
from contextlib import asynccontextmanager
def fake_answer_to_everything_ml_model(x: float):
return x * 42
ml_models = {}
@asynccontextmanager
async def setup_model(app: FastAPI):
# Load the ML model
ml_models["answer_to_everything"] = fake_answer_to_everything_ml_model
yield
# Clean up the ML models and release the resources
ml_models.clear()
async def long_running_task(foo, bar):
print(f"Starting {foo} {bar} task")
some_api = SomeApi(foo)
try:
while True:
updates = some_api.poll_for_updates()
other_api.push_changes(updates, bar)
await asyncio.sleep(5) # add some polling delay to avoid running too often
except asyncio.CancelledError:
some_api.close() # clean up the API if needed
print("Task was stopped")
app = rx.App()
app.register_lifespan_task(setup_model)
app.register_lifespan_task(long_running_task, foo=42, bar=os.environ["BAR_PARAM"])
Improvements
- Catch more errors in frontend/backend by @picklelo in #3346
- Use twine environment variables if set by @ericwb in #3353
- add style for orientation=vertical in tabs by @Lendemor in #3332
- Added config for number of gunicorn workers by @Snaipergelka in #3351
- feat: Optionally comparing fields in Var.contains, e.g. on rx.Base based types. by @abulvenz in #3375
Bug Fixes
- fix rx.cond with ComputedVars and use union type by @benedikt-bartscher in #3336
- do not check attribute type for var internals by @benedikt-bartscher in #3357
- [REF-2915] ComponentState subclasses are always treated as mixin by @masenf in #3372
- Fix regression when subclassing a ComponentState subclass.
- set config.deploy_url during AppHarness tests by @benedikt-bartscher in #3359
- [REF-2878] Map fontFamily to fontFamily and --default-font-family by @masenf in #3380
- url quote the str data passed to rx.download by @masenf in #3381
Readme Updates
- update README to use 0.5.0 by @Lendemor in #3313
- #3321: Update Chinese README.md by @seewindcn in #3350
- Update Spanish README.md by @boterop in #3330
- Update Korean README.md by @owlur in #3337
Other Changes
- Add some minimal validation of pyproject.toml by @ericwb in #3339
- Suppress runtime warnings by @picklelo in #3354
New Contributors
Full Changelog: https://github.com/reflex-dev/reflex/compare/v0.5.1..v0.5.2
v0.5.1
New Features
- Connection Error modal is now a dismissable toast by @Lendemor in #3242
- rx._x.client_state: react useState Var integration for frontend and backend by @masenf in #3269
- Work in progress, API subject to change
- Support replacing route on redirect by @masenf in #3072
Improvements
- rx.accordion customizability overhaul by @masenf in #3266
- #3185 fix tailwind.config.js: support corePlugins, important, prefix,β¦ by @seewindcn in #3260
- FIX - Error: img is a self-closing tag and must neither have children nor use dangerouslySetInnerHTML. by @Yummy-Yums in #3307
- Get
action
,cancel
,on_dismiss
andon_auto_close
working for rx._x.toast by @masenf in #3216 - typed mixins and ComponentState by @benedikt-bartscher in #3196
- [REF-2787] add_hooks supports Var-wrapped hooks by @masenf in #3248
- Add end line in .gitignore when
reflex init
by @boterop in #3309 - allow passing kwargs and options to selenium webdriver by @benedikt-bartscher in #2894
Bugfixes
- Only import PyiGenerator when needed by @masenf in #3291
- Typo in contact email address by @ericwb in #3292
- properly replace ComputedVars by @benedikt-bartscher in #3254
- throw error for componentstate in foreach by @Lendemor in #3243
Dependencies
- Bump Bun version by @ElijahAhianyo in #3281
Other Changes
- [REF-2776] enable telemetry for frontend package download subprocess by @martinxu9 in #3270
- [REF-2774] Add ReflexError and subclasses, send in telemetry by @martinxu9 in #3271
- [REF-2774] Send runtime error in telemetry by @martinxu9 in #3276
- Automatically label bug report issues with bug tag by @ericwb in #3288
- [REF-2803]Add imports benchmarks by @ElijahAhianyo in #3272
- Mirgrate from pip to uv by @ericwb in #3285
- Adds dependency review action to verify allowed licensed dependencies by @ericwb in #3306
New Contributors
- @seewindcn made their first contribution in #3260
- @ericwb made their first contribution in #3288
- @boterop made their first contribution in #3309
Full Changelog: v0.5.0.post1...v0.5.1
v0.5.0.post1
Escape Hatch to avoid Bun on Windows
These exceptions only apply to Windows native platform (not WSL)
- [REF-2814]Throw Warning for Projects Created in OneDrive on Windows (#3304)
- Skip bun when project path contains "onedrive"
- Skip bun when
REFLEX_USE_NPM=1
(environment variable)
Full Changelog: v0.5.0...v0.5.0.post1
v0.5.0
Breaking Changes
Radix Themes 3.0
rx.badge
now hassize="3"
available, and sizes"2"
and"1"
have been adjusted accordinglyrx.input.root
andrx.input.input
are deprecated. Just userx.input
as the root. It acceptsrx.input.slot
as a child.- [REF-2789] Graceful deprecation of
rx.input.root
andrx.input.input
#3249
- [REF-2789] Graceful deprecation of
Previously Deprecated Features Removed
get_asset_path
removed- passing
state
torx.App
- passing
script_tags
torx.App.add_page
- passing
custom_styles
torx.markdown
(usecomponent_map
instead) rx.State
getters removed (useself.router
instead)get_token
get_sid
get_headers
get_client_ip
get_current_page
get_query_params
get_cookies
Remove deprecations for 0.5.0 by @picklelo in #3222
New Features
Radix Themes 3.0
rx.spinner
- new component for indeterminate loadingrx.skeleton
- new component for placeholder loadingloading
prop available forrx.button
rx.icon_button
rx.spinner
andrx.skeleton
-- useloading=State.is_loading
instead of usingrx.cond
rx.data_list
- new component for showing key value pairsrx._x.progress
- experimental radix themes progress component, supportsduration
for indeterminate progress.
Radix 3.0 by @Lendemor in #3159
New Public API for wrapping Components
To make wrapping components easier and less error prone, the following functions should be overridden when wrapping components:
add_style
- return anrx.style.Style
for default component stylesadd_imports
- return a dictionary of{"library-name@0.5.0": {"tag1", "tag2", "tag3"}}
of required imports -- it will automatically be merged with the other component imports.add_hooks
- return a list of javascript snippets that will go inside the component function -- it will be deduped automatically with any other hooksadd_custom_code
- return a list of javascript snippets that will go inside the module for each page the component is included in.
With these new methods, Reflex will internally call them for each parent class your component inherits from, so there is no need to call super().add_*
or do any merging yourself.
- [REF-2523] Implement new public Component API by @masenf in #3203
- add_style api by @Lendemor in #3202
State.setvar(var_name, value)
A less magic version of the automatic State.set_x
setter functions which accept the var_name
as a string.
Experimental Toast Component
def try_some_toast():
return rx.fragment(
rx.button("π₯", on_click=rx._x.toast.info("Cheers"), variant="outline"),
rx._x.toast.provider(),
)
Generic .throttle
and .debounce
for all Event types
class ThrottleState(rx.State):
last_event: datetime.datetime = datetime.datetime.now()
def handle_mouse_move(self):
self.last_event = datetime.datetime.now()
def throttle_example():
return rx.box(
ThrottleState.last_event,
background_color=rx.color("red", 7),
width="500px",
height="500px",
on_mouse_move=ThrottleState.handle_mouse_move.throttle(500), # one event every 500ms
)
rx.container
new prop stack_children_full_width
For a nice streamlit-like wide layout, use the following snippet:
def index():
return rx.container(
rx.vstack(content()),
stack_children_full_width=True,
)
This will cause all vstack/hstack children and most stack child components to have width="100%"
automatically, which provides a nice aesthetic for many apps without applying CSS to individual components.
- [REF-2574] Default width for Stack (+children) and default padding for container by @masenf in #3104
Improvements
Unify on ruff-format
- ruff-format: unify Black with Ruff
v0.1
by @Borda in #2837 - sync ruff version in pyproject.toml with the precommit one by @Lendemor in #3150
Error Messages
- [REF-2636]Improve Error message for unsupported event trigger by @ElijahAhianyo in #3147
- prevent shadowing by @Lendemor in #3221
- Better error when a computed var has the same name as an existing state var.
- [REF-2643]Throw Errors for duplicate Routes by @ElijahAhianyo in #3155
- [REF-2622]Throw warning for incompatible uvicorn version on windows by @ElijahAhianyo in #3246
rx.color_mode
changes
rx.color_mode.button
now has built in positioning prop for floating button
Default style for rx.upload
- Refactor upload component and add styled upload component by @Ifechukwu001 in #3035
Use Alembic Batch Mode for reflex db makemigrations
This improves compatibility with the default sqlite database when re-typing columns.
README
- add color dalle code example by @tgberkeley in #3108
- a little correction in the "es" docs by @JLDev-coder in #3127
- Add Japanese README.md file by @PeterYusuke in #3234
Miscellaneous
- add default underline for links by @Lendemor in #3148
- Expose
color_scheme
on TabsTrigger by @masenf in #3112 - update blank template by @Lendemor in #3219
- Clean up config and app API by @picklelo in #3197
- Fixed unused kwargs in reflex.App by @Snaipergelka in #3170
- Now able to pass a custom
SocketIO
instance
- Now able to pass a custom
Bugfixes
- [REF-2587] Ignore top-level theme appearance by @masenf in #3119
- avoids "flickering" when the top-level appearance differs from user selected mode
- [REF-2619] Re-init when the template is out of date by @masenf in #3121
- Fixed app name validation by @Snaipergelka in #3146
- extend rx.input allowed types by @Lendemor in #3149
- [REF-2682] Foreach over dict uses Tuple arg value by @masenf in #3160
- Improve nested foreach when dict has complex values
- Update CodeBlock class to accept rx.color in custom_style by @khhan0130 in #3168
- Windows
--frontend-only
fix ctrl + c by @ElijahAhianyo in #3181 - [REF-2676][REF-2751]Windows Skip ARM devices on bun install + Telemetry by @ElijahAhianyo in #3212
- icon_button: Icon size should be specified as int pixels, not str by @masenf in #3247
- copy background task marker by @benedikt-bartscher in #3255
- Can now define background tasks in a state mixin
- Dynamic NoSSRComponent properly renders in prod mode when using State/event handlers
Dependencies
- Bump bun version to 1.1.5 by @ElijahAhianyo in #3176
- Windows Pin Bun version by @ElijahAhianyo in #3192
- Windows Pin Version followup (Use Windows Install Link) by @ElijahAhianyo in #3193
- [REF-2764] dep update 0.5.0 by @masenf in #3245
- gunicorn 22.0.0 with security fix
Other Changes
- separate DECORATED_PAGES per reflex app by @benedikt-bartscher in #3102
- fix: args issue in
__init__
of App class by @nautics889 in #3141 - [REF-2620] Fallback to npm (not bun) by @masenf in #3138
- pin macos version for CI by @Lendemor in #3145
- [REF-2618] Send template info in init telemetry event by @martinxu9 in #3153
- Integration testing: Firefox compatibility by @masenf in #3162
- Improved get_attribute_access_type by @benedikt-bartscher in #3156
- custom component install command to install current project in editable mode by @martinxu9 in #3200
- migrate deprecated redis.close to redis.aclose by @benedikt-bartscher in #3199
- allow optional props with None default value by @benedikt-bartscher in #3179
- Allow StatefulComponent to also be rendered via
__str__
by @m...
v0.4.9
New Features
Improvements
- Simplify
run_process_with_fallback
logic by @masenf in #3089 - Use Fallback command on all platforms by @ElijahAhianyo in #3099
- allow set in var.contains by @martinxu9 in #3113
Bug Fixes
- [REF-2586] Pass child event_trigger through DebounceInput by @masenf in #3092
on_key_down
/on_key_up
work with controlled inputs
- [REF-2589] Use errors='replace' with subprocess by @masenf in #3096
- Avoid UnicodeDecodeError on windows
- [REF-2587] Ignore top-level theme appearance (#3119)
Experimental
Other Changes
- do not clear all decorated pages during AppHarness tests by @benedikt-bartscher in #3093
- improve auto-generated AppHarness app_name with partials by @benedikt-bartscher in #3088
- app_source can be partial by @benedikt-bartscher in #3100
- pin react-focus-lock to 2.11.3 (#3123)
Full Changelog: v0.4.8...v0.4.9
v0.4.8.post1
Pin react-focus-lock to 2.11.13 #3123
v0.4.8
New Features
new transpile_packages
field in rx.Component
For packages on npm which are not exported as modules, these can now be transpiled by Next.JS and used directly.
Improvements
Use bun
as a package manager on windows
Much faster package installation on windows!
x64 only (no x86 or ARM support)
Upload with no files selected still calls event handler
Note: you need to specify a default value for your files parameter to take advantage of this change.
- Fix For When user selects Empty files using File Upload by @Yummy-Yums in #3051
Enum types are now serialized to their value
- added serializer for enums by @wassafshahzad in #3058
Automatic tuple unpacking also works for Component children
- [REF-2524]Tuple unpacking should apply at component level by @ElijahAhianyo in #3062
Bug Fixes
- minimal fix for upload_url in rx.download by @Lendemor in #3073
- Force pydantic v1 for sqlmodel compatibility by @masenf in #3026
- Fix annotated EventHandler by @masenf in #3076
Experimental
Other Changes
- chore: fix some typos in comments by @hugehope in #3071
- fix: removed .git in template URL by @wassafshahzad in #3049
New Contributors
Full Changelog: v0.4.7...v0.4.8
v0.4.7
New Features
New reflex init
templates
We've added 4 new base templates to reflex init
.
(0) blank (https://blank-template.reflex.run) - A minimal template
(1) dashboard (https://dashboard.reflex.run) - A dashboard with tables and graphs
(2) chat (https://chat.reflex.run) - A ChatGPT clone
(3) sidebar (https://sidebar-template.reflex.run) - A template with a sidebar to navigate pages
You can also specify the template directly
reflex init --template chat
- Update sidebar temp by @Alek99 in #2959
- Support reflex app creation from templates from github by @martinxu9 in #2490
Use any Reflex app on Github as an initial template
reflex init
now also supports passing in any Github url as a template. Currently the Reflex app must be in the root of the Github directory (meaning the rxconfig.py
should be in the root.
reflex init --template https://github.com/reflex-dev/reflex-chat
- Support reflex app creation from templates from github by @martinxu9 in #2490
reflex run
will automatically init the app when required
Previously when updating versions of Reflex or cloning an existing Reflex app, you would have to run reflex init
before you can reflex run
. From 0.4.7, reflex init
is only required the very first time you create an app. If you are missing a .web
folder or there's a new version of Reflex, reflex run
and reflex export
will automatically init
the app for you.
rx.logo()
component to display the Reflex logo
Show Built with Reflex logo.
rx.logo()
- adding a reflex logo component by @tgberkeley in #2994
Reflex Experimental Namespace
We've introduced a new rx._x
namespace where we will be putting experimental features for early testers before they go into general release. This will help us make sure new features have time to mature with real users before we make them public
Improvements
None
can be passed in as a component prop and it will be skipped
- Logic for removing the 'None' property along with its corresponding test cases by @AmanSal1 in #2969
Leaving a trailing comma on a reflex component won't throw an error anymore as we unpack the tuple
- Unpack component tuples in a fragment by @ElijahAhianyo in #2985
Bug Fixes
- [REF-2425] Reduce unnecessary CI runs by @martinxu9 in #2966
- adjust share command prompt by @martinxu9 in #2965
- Windows uvicorn bug fix by @sid-38 in #2954
- use dict instead of set to store hooks by @Lendemor in #2995
- Added custom_attrs to the list of trigger props by @SwarajBaral in #2980
- Exclude .web dir when running uvicorn by @ElijahAhianyo in #2986
- Fix typo in page.py by @thphuc in #3001
Misc
- Lendemor/improve coverage by @Lendemor in #2988
- Include architecture post in readme by @picklelo in #2993
- Remove extra spaces in the keywords in pyproject.toml template by @martinxu9 in #2990
- add logo to blank template by @tgberkeley in #3014
- [REF-2296] Rename recursive functions by @martinxu9 in #2999
- [REF-2303] Update custom component template for new API by @martinxu9 in #3007
- remove types-tabulate from dev dependencies by @martinxu9 in #2977
New Contributors
- @AmanSal1 made their first contribution in #2969
- @sid-38 made their first contribution in #2954
- @SwarajBaral made their first contribution in #2980
- @thphuc made their first contribution in #3001
Full Changelog: v0.4.6...v0.4.7
v0.4.6
Known Issues
- Unhandled runtime error when navigating between pages in a stateless app.
- Fix: c78884b
This Release was Airdropped from 30000' over Nevada πͺ
Breaking Changes
Use dill
instead of cloudpickle
In reflex-0.4.6, existing states persisted in redis are not compatible. Redis should be cleared and existing states/sessions discarded after upgrading.
New Features
reflex component share
CLI
Simplify sharing of custom 3rd party components to the Reflex Component Gallery.
- [REF-2168] Add share options to custom component commands by @martinxu9 in #2883
rx.ComponentState
An easy way to define per-component State.
import reflex as rx
class CounterButton(rx.ComponentState):
count: int
def increment(self):
self.count += 1
def decrement(self):
self.count -= 1
@classmethod
def get_component(cls, *children, **props):
return rx.button(
f"Counter {cls.count}",
on_click=cls.increment,
on_context_menu=cls.decrement.prevent_default,
)
counter_button = CounterButton.create
@rx.page()
def index():
return rx.vstack(
*[counter_button() for _ in range(10)]
)
app = rx.App()
Automatically Select Next Available Port
When the configured port is not available, automatically select the next sequential port until one is available
- added feature to automatically change port by @wassafshahzad in #2867
Expanding Textarea
New props on rx.el.textarea
and rx.text_area
allow the field to expand to match content and submit the form when Enter is pressed (shift+enter to create a new line)
rx.scroll_to
event
Scroll the viewpoint to show a given element by ID.
- Scroll to feature by @Yummy-Yums in #2948
Improvements
Simplify Component Wrapping API
[REF-2272] Support declaring EventHandlers directly in component by @martinxu9 in #2952
Props typed as rx.EventHandler
can be used to define event triggers without overriding get_event_triggers
method. The argument of the type specifies the JS to Python mapping: on_click: rx.EventTrigger[lambda e: [e]]
.
generate pyi files when building/publishing 3rd party component by @Lendemor in #2945
Third-party components will now have .pyi
files generated for them to improve IDE completion, similar to the built in Reflex components.
Updated Lucide Icons
The latest icons available on https://lucide.dev are now usable in Reflex. Some icon names have changed, these will print a deprecation warning pointing to the new name. The old names will be removed in 0.5.0.
- Update LUCIDE_ICON_LIST with newest Icon names by @luccavp12 in #2891
Loosen Requirement Pins
Reflex is now compatible with a wider range of dependencies. Notably, it can be used with packages that depend on Pydantic v2 (although the framework itself is still using v1).
Note: due to a regression in recent uvicorn
versions, that dep will remain pinned as it was in 0.4.5.
Avoid content flicker when using State.is_hydrated
is_hydrated
is set to False immediately when a navigation event starts, and is set back to True after all on_load events have executed. This avoids content flickering into view before a loading spinner is displayed when the spinner is conditional on the value of State.is_hydrated
.
Additionally, the WiFi off connection error pulser is only displayed when connection errors are detected (before it was displayed whenever the page was not hydrated).
Miscellaneous
- [REF-1982] state: Warn if redis state is "too big" by @masenf in #2868
- use radix box instead of chakra one for responsive elements by @Lendemor in #2921
- [REF-2229]Dedupe deprecation warnings by @ElijahAhianyo in #2871
- fix hook order to use ref inside user hooks by @Lendemor in #2906
- Ensure user-defined hooks can always access refs
- [REF-2302] When a Var points to a model, prefer access to model fields. by @masenf in #2893
Bug Fixes
- [REF-2117]:
rx.color_mode_cond
to work in f-strings by @ElijahAhianyo in #2775 - Default to None if bun/fnm version is Invalid by @ElijahAhianyo in #2940
- remove inheritance from Flex for list components by @Lendemor in #2936
- Fix markdown rendering of lists
- parse_args_spec: resolve annotations with typing.get_type_hints by @masenf in #2849
- [REF-2219] Avoid refetching states that are already cached by @masenf in #2953
- Fix issue affecting Cookie/LocalStorage values when substates contained computed vars
- [REF-2306] Include twine in dependencies on pyproject.toml by @martinxu9 in #2895
Other Changes
- Fix #2877, PR title not available for push/PR merge by @martinxu9 in #2889
- [REF-2284]Benchmark add extra info on publishing data by @ElijahAhianyo in #2864
- Revert "add precommit check added large files and git lfs rules (#2866)" by @picklelo in #2905
- [REF-1682][REF-1683][REF-1684][REF-2283]Benchmark reflex package size and .web folder by @ElijahAhianyo in #2880
- fix AppHarness reloading by @benedikt-bartscher in #2916
- Remove page.pyi: it's out of date, and not necessary by @masenf in #2924
- [REF-2416] Pass shell=True when starting AppHarness on Windows by @masenf in #2944
- updated watchdog dep by @Yummy-Yums in #2946
- Update README.md by @ChicIceCream in #2963
New Contributors
- @luccavp12 made their first contribution in #2891
- @mahrz24 made their first contribution in #2796
- @ChicIceCream made their first contribution in #2963
Full Changelog: v0.4.5...v0.4.6
v0.4.5
New Features
Support SQLAlchemy Models Directly
- Bare sqlalchemy metadata by @benedikt-bartscher in #2355
Experimental Multi-process Compilation
Pass REFLEX_COMPILE_PROCESSES=0
to opt-in to multiprocess compile, which significantly improves compilation speed of large apps (Mac and Linux only).
Improvements
- improve event handler state references by @benedikt-bartscher in #2818
- Allow access to position from HighLevelSelect by @hjpr in #2829
- [REF-2157] Allow
rx.download
to resolverx.get_upload_url
links by @masenf in #2813 - better default title for seo (also remove default description) by @Lendemor in #2844
- Make @rx.memo work with state vars passed as props by @masenf in #2810
- added name of Var to error message by @emmakodes in #2827
Bug Fixes
- [REF-2172] Add DECORATED_PAGES before compiling in thread by @masenf in #2841
- Fix known regression with py3.8 and py3.9
- Remove width prop from rx.select by @picklelo in #2835
- Get
client_ip
fromasgi.scope
by @masenf in #2808router.session.client_ip
more likely to be correct now
- convert text inside list_item to span and set icon display to inline by @Lendemor in #2860
Other Changes
- [REF-2086] Avoid "Warning: The path to the Node binary could not be found. by @masenf in #2803
- telemetry refactor + unit tests by @Lendemor in #2786
- Custom Component Request Template by @Alek99 in #2853
- Benchmark with app harness by @ElijahAhianyo in #2774
- Fix py3.8 integration test_var_operations.py by @masenf in #2858
- Account for imports of @rx.memo components for frontend package installation by @masenf in #2863
- [REF-2216] Warn if windows is used with py312 by @masenf in #2856
- Separate
get_hooks
andget_hooks_internal
for stable output by @masenf in #2710 - [REF-2219] vars: set
_was_touched
when updating cached vars by @masenf in #2886
New Contributors
- @hjpr made their first contribution in #2829
- @emmakodes made their first contribution in #2827
Full Changelog: v0.4.4...v0.4.5