Reflex 使用指南:用纯 Python 构建全栈 Web 应用并快速部署
2026/9/10 8:18:03 网站建设 项目流程

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-corereflex-components-radixreflex-components-recharts等),这也是"开箱即用、组件丰富"这一体验的底层来源。

环境准备与安装

强烈建议使用虚拟环境,以确保reflex命令出现在 PATH 中。README 与 docs/getting_started/installation.md 均推荐使用 uv 作为默认包管理工具(venvcondapoetry也是可选方案)。

在 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

逐步拆解如下:

  1. mkdir my_app_name && cd my_app_name:创建并进入应用目录;
  2. uv init:初始化一个 Python 项目(生成pyproject.toml等基础文件);
  3. uv add reflex:安装 Reflex,并把依赖写入pyproject.toml
  4. uv run reflex init:初始化 Reflex 项目骨架——它会创建应用目录、assets静态资源目录、rxconfig.py配置文件,并生成默认应用文件(如my_app_name/my_app_name.py);
  5. 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 = False

State保存应用的可变数据,类中声明的带类型注解的字段被称为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推送中间状态。上面的generateyield一次,把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)、EventHandlercall_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_changeon_click)把 UI 动作接到事件处理器上;
  • CSS 属性以 snake_case 形式作为 prop 传入(如font_sizeborder_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.buttonrx.inputrx.imagerx.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 给出了完整链路:

  1. 用户点击 "Generate" 按钮;
  2. 触发on_click事件;
  3. State.generate在服务器端执行;
  4. 状态被更新(processingimage_url等);
  5. UI 依据新状态自动重渲染。

这条链路也解释了 Reflex 的编译期/运行期划分:编译期,页面组件被编译成在浏览器运行的 JavaScript;运行期,State 与事件处理器以纯 Python 形式运行在服务器端。因此组件树中对 state var 使用原生if/for/len()是不允许的(编译期无法获知运行时值),必须改用rx.condrx.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),并管理initrunexportdeploy等子命令。其中与云端部署相关的命令依赖独立的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 inituv add reflexuv run reflex inituv 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询