12345678910111213141516171819202122232425262728293031 |
- """Shims the real reflex app module for running backend server (uvicorn or gunicorn).
- Only the app attribute is explicitly exposed.
- """
- from concurrent.futures import ThreadPoolExecutor
- from reflex import constants
- from reflex.utils.exec import is_prod_mode
- from reflex.utils.prerequisites import get_app, get_compiled_app
- if "app" != constants.CompileVars.APP:
- raise AssertionError("unexpected variable name for 'app'")
- app_module = get_app(reload=False)
- app = getattr(app_module, constants.CompileVars.APP)
- compile_future = ThreadPoolExecutor(max_workers=1).submit(app.compile_)
- compile_future.add_done_callback(
- # Force background compile errors to print eagerly
- lambda f: f.result()
- )
- # Wait for the compile to finish in prod mode to ensure all optional endpoints are mounted.
- if is_prod_mode():
- compile_future.result()
- # ensure only "app" is exposed.
- del app_module
- del compile_future
- del get_app
- del get_compiled_app
- del is_prod_mode
- del constants
- del ThreadPoolExecutor
|