Reflex 使用指南:用纯 Python 构建全栈 Web 应用并快速部署
【免费下载链接】reflex🕸️ Web apps in pure Python 🐍项目地址: https://gitcode.com/GitHub_Trending/re/reflex
Reflex 是一个让你用纯 Python 编写全栈 Web 应用的库:前端 UI、后端逻辑乃至数据库访问全部在 Python 中完成,无需学习 JavaScript,也无需单独维护前后端两套工程。本指南以仓库根目录 README.md 为核心,带你走通"安装 → 初始化项目 → 编写交互页面 → 理解底层运行机制"的完整链路,并在关键环节结合仓库源码(如 reflex/state.py、reflex/app.py、reflex/reflex.py)进行验证,帮助你写出可运行、可部署、可扩展的 Reflex 应用。
Reflex 是什么
根据 README.md 的定位,Reflex 的核心能力是:
Build full-stack web apps in pure Python.(用纯 Python 构建全栈 Web 应用。)
它强调两个关键特性:
- Pure Python(纯 Python):应用的前端与后端全部用 Python 编写,不必再学习 JavaScript。Reflex 会把你在 Python 中声明式定义的组件编译为运行在浏览器里的前端代码,而后端逻辑保持 Python 原样运行在服务器上。
- Full Flexibility(完全灵活):Reflex 上手门槛低,几分钟就能跑起第一个应用;同时它也具备支撑复杂应用的能力,可以从小型数据应用扩展到大型多页面网站。官方文档甚至宣称 Reflex 官网本身就是用 Reflex 构建并部署的(见 docs/getting_started/introduction.md)。
在 pyproject.toml 中,项目自述为 "Web apps in pure Python.",要求 Python 版本>=3.10,<4.0,并随包一起分发了一批按功能拆分的组件包(如reflex-components-core、reflex-components-radix、reflex-components-recharts等),这也是"开箱即用、组件丰富"这一体验的底层来源。
环境准备与安装
强烈建议使用虚拟环境,以确保reflex命令出现在 PATH 中。README 与 docs/getting_started/installation.md 均推荐使用 uv 作为默认包管理工具(venv、conda、poetry也是可选方案)。
在 macOS/Linux 上先安装 uv:
curl -LsSf https://astral.sh/uv/install.sh | sh安装完成后重启终端,或执行source ~/.bashrc(zsh 用户执行source ~/.zshrc)。Windows 用户推荐使用 WSL,并可直接用 PowerShell 安装 uv:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"需要注意:Python 3.10 的支持在 reflex/init.py 中已被标记为 "deprecated and will be removed in a future release",建议直接使用 Python 3.11 或更高版本。
创建你的第一个 Reflex 应用
README 给出了基于 uv 的最小启动流程,共四步:
mkdir my_app_name cd my_app_name uv init uv add reflex uv run reflex init uv run reflex run逐步拆解如下:
mkdir my_app_name && cd my_app_name:创建并进入应用目录;uv init:初始化一个 Python 项目(生成pyproject.toml等基础文件);uv add reflex:安装 Reflex,并把依赖写入pyproject.toml;uv run reflex init:初始化 Reflex 项目骨架——它会创建应用目录、assets静态资源目录、rxconfig.py配置文件,并生成默认应用文件(如my_app_name/my_app_name.py);uv run reflex run:启动开发服务器。
启动成功后,访问 http://localhost:3000 即可看到你的应用。uv run reflex run默认同时拉起前端(:3000)与后端(:8000)两个服务,排查问题时可用uv run reflex run --loglevel debug提升日志详细程度(见 docs/getting_started/installation.md)。
reflex init在交互提示中会询问使用哪种模板:
Initializing the web directory. Get started with a template: (0) A blank Reflex app. (1) Try our AI builder. Which template would you like to use? (0):首次上手建议选择(0) A blank Reflex app。
初始化后的项目结构
初始化完成后的典型目录结构(详见 docs/getting_started/project-structure.md):
hello ├── .venv # uv 创建的虚拟环境,隔离项目依赖 ├── .web # 前端编译产物目录,由 Reflex 自动生成,无需手动编辑 ├── assets # 存放图片、字体等公开静态资源 ├── hello │ ├── __init__.py │ └── hello.py # 你的应用主文件,默认应用写在这里 ├── .gitignore ├── .python-version ├── pyproject.toml # Python 项目元数据与依赖声明 ├── rxconfig.py # Reflex 应用配置入口 └── uv.lock # 锁定完整依赖版本,保证可复现安装几个要点:
.web/是编译后的 JavaScript 存放位置,每个 Reflex 页面会对应编译出.web/pages下的一个.js文件,调试时可以参考,但不要手工修改;- 前端依赖的锁文件存放在项目根目录的
reflex.lock/bun.lock,独立目录可避免与用户自管的 bun 项目冲突; rxconfig.py默认形如:
import reflex as rx config = rx.Config( app_name="hello", )修改my_app_name/my_app_name.py后保存,Reflex 会热更新(fast refresh),刷新即见效果,这是开发阶段的核心体验。
示例应用:用纯 Python 构建图片生成 App
README 提供了一个完整的可运行示例——一个调用图像模型生成图片的应用。它只用了三个核心概念:State(状态)、event handlers(事件处理器)与components(组件)。
import reflex as rx import openai client = openai.AsyncOpenAI() class State(rx.State): prompt: str = "" image_url: str = "" processing: bool = False @rx.event def set_prompt(self, value: str): self.prompt = value @rx.event async def generate(self): self.processing = True yield response = await client.images.generate( model="gpt-image-1.5", prompt=self.prompt, ) self.image_url = f"data:image/png;base64,{response.data[0].b64_json}" self.processing = False def index(): return rx.vstack( rx.heading("Image Generator"), rx.input(placeholder="Enter a prompt...", on_change=State.set_prompt), rx.button("Generate", on_click=State.generate, loading=State.processing), rx.image(src=State.image_url), ) app = rx.App() app.add_page(index, title="Reflex:Image Generation")Reflex 图片生成示例应用预览
下面逐块拆解这段代码背后的机制。
1. State:应用的数据中枢
class State(rx.State): prompt: str = "" image_url: str = "" processing: bool = FalseState保存应用的可变数据,类中声明的带类型注解的字段被称为vars(状态变量)。前端组件引用这些 var 后,会在状态变化时自动响应式地重新渲染(详见 docs/getting_started/basics.md 与 docs/vars/base_vars.md)。
在源码层面,reflex/state.py 定义了完整的State体系:状态通过 delta(增量)机制同步到前端,并提供了类型检查、序列化、代理对象(MutableProxy)等能力;过大的状态还会触发StateTooLargeError之类的一致性保护。从实现看,Reflex 会把 state var 编译为前端可引用的变量,并在事件处理后仅推送发生变化的部分,这是它"前端轻量同步"的底层支撑。
2. Event handlers:唯一允许修改状态的地方
@rx.event def set_prompt(self, value: str): self.prompt = value @rx.event async def generate(self): self.processing = True yield response = await client.images.generate(...) self.image_url = ... self.processing = False事件处理器(event handlers)是修改 State 的唯一途径,用户点击、输入等动作(即事件)触发它们。要点:
@rx.event装饰器自 Reflex 0.6.5 起被强烈推荐,它能让事件处理器获得正确的静态类型检查(参数数量与类型不匹配会在编译期报错);- 事件处理器可以是
async的,也可以使用yield推送中间状态。上面的generate先yield一次,把processing = True推送到前端(按钮随即进入 loading 状态),再异步等待模型返回结果,最后更新image_url并结束处理。这正是 docs/getting_started/installation.md 中提到的 "Event handlers may beasyncand mayyieldto push intermediate UI updates" 约定; - 事件处理器运行在后端Python 进程中,因此可以自由使用任意 Python 库与任意代码——这里直接调用了
openai的异步客户端。
从源码看,reflex/event.py 是reflex_base.event的重导出模块,事件、事件链(EventChain)、EventHandler、call_script等基础设施都在此命名空间下注册,并最终通过 reflex/init.py 以rx.event等名称暴露给用户。
3. Components:声明式 UI
def index(): return rx.vstack( rx.heading("Image Generator"), rx.input(placeholder="Enter a prompt...", on_change=State.set_prompt), rx.button("Generate", on_click=State.generate, loading=State.processing), rx.image(src=State.image_url), )UI 由组件构建:
- 子组件通过位置参数嵌套,属性通过关键字参数(props)传入;
- 组件引用 state var(如
rx.image(src=State.image_url))时具备响应式能力——状态一变,UI 自动更新; - 事件触发器(如
on_change、on_click)把 UI 动作接到事件处理器上; - CSS 属性以 snake_case 形式作为 prop 传入(如
font_size、border_radius),并支持 Tailwind 与自定义样式。
Reflex 内置了 50+ 组件,覆盖表单、布局、数据展示、图表等场景;当内置组件不够用时,还可以包装任意 React 组件(详见 docs/components/conditional_rendering.md、docs/components/props.md、docs/wrapping-react/overview.md)。
从 reflex/init.py 可以看到,rx.*命名空间采用懒加载(lazy_loader)方式注册了大量组件:rx.button、rx.input、rx.image、rx.vstack等来自reflex_components_core与 Radix 主题映射,rx.data_table来自 gridjs,rx.plotly来自 plotly 包,rx.code_block来自 code 组件包。这意味着"组件丰富"不是堆在一个大文件里,而是按功能拆分成独立发行包、按需导入——既降低了导入开销,也方便单独演进。
4. App 与页面注册
app = rx.App() app.add_page(index, title="Reflex:Image Generation")rx.App是应用的入口对象,add_page把页面函数注册到指定路由。在源码 reflex/app.py 中,add_page的签名支持这些常用参数:
component:页面组件或返回组件的可调用对象;route:页面路由,若组件是函数则默认以函数名作为路由;title/description:页面标题与描述(SEO 元信息);image:页面展示图片;on_load:页面每次加载时触发的事件处理器;meta:页面元数据;context:供页面使用的自定义上下文。
创建多个页面并链接导航的完整路由机制可参考 docs/pages/overview.md。
事件响应链路:一次点击发生了什么
对于rx.button("Generate", on_click=State.generate)这样的交互,docs/getting_started/introduction.md 给出了完整链路:
- 用户点击 "Generate" 按钮;
- 触发
on_click事件; State.generate在服务器端执行;- 状态被更新(
processing、image_url等); - UI 依据新状态自动重渲染。
这条链路也解释了 Reflex 的编译期/运行期划分:编译期,页面组件被编译成在浏览器运行的 JavaScript;运行期,State 与事件处理器以纯 Python 形式运行在服务器端。因此组件树中对 state var 使用原生if/for/len()是不允许的(编译期无法获知运行时值),必须改用rx.cond、rx.foreach与 var 运算符——这是新手最常见的错误(详见 docs/getting_started/basics.md 与 docs/components/conditional_rendering.md)。
命令行工具与部署
reflex命令本身在 pyproject.toml 中注册为reflex = "reflex.reflex:cli",其实现位于 reflex/reflex.py:cli是一个基于 click 的命令组,自带版本号(reflex --version),并管理init、run、export、deploy等子命令。其中与云端部署相关的命令依赖独立的reflex-hosting-cli包(pyproject.toml中已将其列为默认依赖),若缺失会给出安装提示。
本地自托管部署、Docker 镜像与反向代理等方案,可参考本仓库的 docker-example/ 目录——它提供了simple-one-port(单端口)、production-one-port(生产单端口)、production-compose(Caddy + Compose)等多种现成模板,配合 docs/hosting/self-hosting.md 即可完成生产级部署。Reflex Cloud 的一键部署流程见 docs/hosting/deploy-quick-start.md。
小结与下一步
本指南从 README.md 出发,完成了:
- 环境准备与 uv 安装;
- 通过
uv init→uv add reflex→uv run reflex init→uv run reflex run创建并运行第一个应用; - 借助图片生成示例,掌握 State / 事件处理器 / 组件 / 页面注册四大核心概念;
- 结合源码理解事件链路、编译期与运行期边界,以及
rx.*组件的懒加载组织方式。
继续深入的方向:
- 状态体系:状态继承、计算属性(
@rx.var)、组件级状态与共享状态,见 docs/state/overview.md 与 docs/vars/computed_vars.md; - 路由与多页面:动态路由、页面导航,见 docs/pages/overview.md 与 docs/pages/dynamic_routing.md;
- 底层原理:前端如何编译、状态如何同步,见 docs/advanced_onboarding/how-reflex-works.md;
- 实战教程:仪表盘数据应用见 docs/getting_started/dashboard_tutorial.md,流式 AI 对话应用见 docs/getting_started/chatapp_tutorial.md。
【免费下载链接】reflex🕸️ Web apps in pure Python 🐍项目地址: https://gitcode.com/GitHub_Trending/re/reflex
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考