R

ReflexKR

Reflex 官方文档

用 Reflex 入门 Python 全栈 Web 开发

·

课程概览

1

Reflex 简介与开发环境

2

用组件绘制界面

3

State 与 Var:让数据驱动界面

4

事件与表单:添加客户

5

数据处理与图表

6

总结、调试与下一步

·

附录

用 Reflex 入门 Python 全栈 Web 开发
第6课

时间 3:45–4:00

总结、调试与下一步

今天做的应用,都围绕着状态(State)→ 界面(Var)→ 事件(事件处理器)→ 状态变更这一个循环运转。Reflex 应用无论变得多大,也只是这样的循环变多而已。

6-1. 一张表回顾今天所学(5 分钟)

概念代码中要记住的一句话
组件rx.box(子元素, 属性=值)位置参数是子元素,关键字参数是属性
页面app.add_page(index, on_load=...)一个页面 = 一个函数
Stateclass State(rx.State)必须写类型注解,按会话保存在服务器内存中
VarState.users.length()在界面函数中它不是值,而是表达式
循环与条件rx.foreach、rx.cond用来代替 Var 上的 for、if
事件@rx.event def add_user(self, ...)修改状态的唯一途径,运行的是真正的 Python
表单rx.form(on_submit=...) + name=name 就是 form_data 的键
受控组件open= + on_open_change=setter 需要自己定义(0.10)
computed var@rx.var def ...() -> 类型由其他状态计算得出的值
图表rx.recharts.bar_chart(data=...)数据格式是 list[dict]

6-2. 常见错误与解决方法(5 分钟)

症状原因解决方法
TypeError: object of type '...Var' has no len()在界面函数中对 Var 使用了 len()改用 .length()
VarTypeError: Cannot convert Var ... to bool对 Var 使用了 if / and / or改用 rx.cond(...)
VarTypeError: Cannot iterate over Var对 Var 使用了 for改用 rx.foreach(...)
AttributeError: ... has no attribute 'set_xxx'以为有自动生成的 setter(旧资料的写法)用 @rx.event 自己定义 setter
点了取消按钮,数据还是被添加了表单中按钮的默认 type 是 submit加上 type="button"
TypeError: __init__() got an unexpected keyword argument输入框的 name 与 dataclass 字段名不一致让两者名称完全一致
对话框打不开只有 open=,没有 on_open_change两者成对使用
图表是空的没有在任何时机填充图表数据注册 on_load,或改用 computed var

3 个调试习惯

  1. 先看服务器终端的日志。事件处理器中抛出的异常,往往不会在界面上明显显示,只会打印在终端里。
  2. 先用 uv run reflex compile --dry 检查一遍。不用启动服务器,就能快速找出界面代码中的语法错误和 Var 错误。
  3. 在事件处理器中加 print()。事件处理器是在服务器上运行的 Python,所以 print(form_data) 会打印到服务器终端。而界面函数中的 print 只会在应用启动时打印一次。

6-3. 扩展作业(课后作业)

按难度从低到高排列。每道题都会更深入地运用今天学到的某个概念。

  1. 删除按钮:在每一行末尾放一个垃圾桶图标(rx.icon("trash-2")),点击后删除该客户。提示:像 on_click=lambda: State.delete_user(user.email) 这样传入参数。
  2. 搜索:做一个按姓名搜索的输入框,用 value= + on_change=(受控组件)连接起来,再把用 computed var 过滤后的列表显示在表格中。试试用 on_change=State.set_search.debounce(300),让搜索只在停止输入后才执行。
  3. 输入校验:如果邮箱重复或格式错误,就返回 rx.toast.error,并且不关闭对话框。
  4. 永久保存:用 SQLModel 建一张 Customer 表,在 on_load 中读取,在 add_user 中写入。刷新页面或重启服务器后,客户数据也应该还在。用 uv add "reflex[db]" 安装;在 Reflex 0.10 中,推荐直接使用 SQLModel,而不是 rx.Model。

6-4. 接下来学什么

  • 多页面与路由:像 @rx.page(route="/customers/[id]") 这样创建动态路由,添加客户详情页。
  • 拆分文件:拆分成 models.py、state.py、components/、pages/,即使项目规模变大也便于管理。
  • 部署:用 reflex run --env prod 确认生产模式,然后部署到 Reflex Cloud 或自己的服务器(Docker)。
  • 官方文档:reflex.dev/docs。较早的博客文章可能用的是已经变更的 API,例如自动 setter、rx.Model、rx.App(theme=...) 等,阅读时请先确认版本。

← 上一课

第5课 · 数据处理与图表

下一课 →

附录

订阅新课时和新课程通知

本课程新增课时或推出后续课程时,我们会发邮件通知你。

收集项目:电子邮箱 · 用途:本课程的新课时和上线通知 · 保存期限:直到你要求删除。不会用于其他用途,也不会提供给他人。回复任意通知邮件,我们会立即删除。

问答

关于本课有任何疑问都可以在这里留言。所有语言版本页面的提问会汇集在一起。

以纯文本显示,不支持链接和格式。

R

ReflexKR

动手学 Python 和 Reflex。所有示例均已在 Reflex 0.10.0 上实际运行验证。

ReflexKR 免费,没有横幅广告。如果对你有帮助,欢迎请我们喝杯咖啡。 ☕ 请我们喝杯咖啡

联盟链接与赞助说明
한국어English日本語简体中文EspañolDeutsch

© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0

Built with Reflex