Python Reflex 使用手册
以下是一份详细的 Python Reflex 使用手册,包含核心概念、组件使用和代码示例:
Python Reflex 全栈开发手册
目录
框架简介
Reflex 是一个基于 React 的纯 Python 全栈框架,特点:
- 实时前端更新
- 自动处理客户端-服务器通信
- 支持响应式布局
- 内置组件库
- 基于 FastAPI 的后端
环境配置
安装要求
- Python 3.7+
- Node.js 16+
# 创建虚拟环境
python -m venv reflex_env
source reflex_env/bin/activate # Linux/Mac
reflex_env\Scripts\activate # Windows
# 安装框架
pip install reflex
项目结构
my_app/
├── my_app/ # 主包
│ ├── __init__.py # 项目初始化
│ └── my_app.py # 主应用文件
├── assets/ # 静态资源
├── .env # 环境变量
└── requirements.txt # 依赖列表
核心概念
基本应用结构
import reflex as rx
class State(rx.State):
"""应用状态定义"""
def index():
"""页面组件定义"""
return rx.container(
rx.heading("欢迎使用Reflex"),
rx.text("当前状态:", State.text_var)
)
app = rx.App()
app.add_page(index, route="/") # 注册页面
app.compile() # 编译应用
组件系统
基础组件使用
def form_example():
return rx.vstack(
rx.input(
placeholder="输入姓名",
on_change=State.set_name, # 绑定状态变更
width="300px"
),
rx.button(
"提交",
on_click=State.handle_submit,
color_scheme="blue"
),
rx.divider(),
rx.text("您输入的是:", State.name)
)
布局组件
def responsive_layout():
return rx.responsive_grid(
rx.box("左侧内容", bg="blue.100", p=4, col_span=2),
rx.box("右侧内容", bg="green.100", p=4),
columns=[1, 2, 3], # 响应式列数
spacing="4"
)
状态管理
基础状态类
class CounterState(rx.State):
count: int = 0 # 自动响应式变量
def increment(self):
self.count += 1
def decrement(self):
self.count -= 1
def counter():
return rx.hstack(
rx.button("-", on_click=CounterState.decrement),
rx.text(CounterState.count),
rx.button("+", on_click=CounterState.increment),
align="center"
)
复杂状态管理
class FormState(rx.State):
username: str = ""
password: str = ""
submitted: bool = False
def handle_submit(self):
self.submitted = True
yield [rx.set_value("password", "")] # 清除密码字段
@rx.var
def form_valid(self) -> bool:
return len(self.username) > 3 and len(self.password) > 6
路由系统
多页面配置
def about_page():
return rx.box(rx.heading("关于我们"), rx.link("返回首页", href="/"))
app = rx.App()
app.add_page(index, route="/")
app.add_page(about_page, route="/about")
动态路由
class PostState(rx.State):
@rx.var
def post_id(self) -> str:
return self.router.page.params.get("id", "0")
def post_detail():
return rx.vstack(
rx.heading(f"文章ID:{PostState.post_id}"),
rx.text("动态路由参数示例")
)
app.add_page(
post_detail,
route="/posts/[id]",
on_load=PostState.load_post # 页面加载时触发
)
样式处理
Tailwind CSS 集成
rx.box(
"样式示例",
class_name="p-4 bg-blue-500 rounded-lg shadow-lg",
_hover={"transform": "scale(1.05)"}
)
全局样式配置
app = rx.App(
style={
"font_family": "Inter",
"theme": rx.theme(
appearance="dark", # 暗黑模式
has_backdrop=True
)
}
)
API 集成
后端路由定义
import requests
class APICallState(rx.State):
data: dict = {}
loading: bool = False
async def fetch_data(self):
self.loading = True
yield
response = requests.get("https://api.example.com/data")
self.data = response.json()
self.loading = False
def api_example():
return rx.cond(
APICallState.loading,
rx.spinner(),
rx.json(data=APICallState.data)
)
部署指南
生产环境配置
# 安装生产依赖
pip install gunicorn uvicorn
# 设置环境变量
export REFLEX_ENV=production
Docker 部署
FROM python:3.9-slim
WORKDIR /app
COPY . .
RUN pip install --no-cache-dir -r requirements.txt
CMD ["reflex", "run", "--host", "0.0.0.0", "--port", "80"]
完整示例:待办事项应用
class TodoState(rx.State):
items: list[str] = ["学习Reflex"]
new_item: str = ""
def add_item(self):
if self.new_item.strip():
self.items.append(self.new_item)
self.new_item = ""
def delete_item(self, item: str):
self.items.remove(item)
def todo_list():
return rx.container(
rx.heading("待办事项"),
rx.input(
value=TodoState.new_item,
on_change=TodoState.set_new_item,
placeholder="添加新事项"
),
rx.button("添加", on_click=TodoState.add_item),
rx.vstack(
rx.foreach(
TodoState.items,
lambda item: rx.hstack(
rx.text(item),
rx.button(
"删除",
on_click=lambda: TodoState.delete_item(item)
)
)
),
spacing="2"
),
max_width="600px",
padding="2rem"
)
最佳实践
- 使用小型状态类管理不同功能模块
- 优先使用内置组件保持一致性
- 合理使用
rx.foreach
处理列表数据 - 通过
@rx.var
创建计算属性 - 使用
rx.cond
处理条件渲染 - 为复杂组件创建自定义组件
- 定期运行
reflex db migrate
管理数据库变更
常见问题
Q: 如何调试状态变更?
A: 在开发模式下运行时,访问 /state
查看当前状态
Q: 如何自定义404页面?
A: 添加 app.add_page(not_found, route="/404")
Q: 如何集成第三方React组件?
A: 使用 rx.chakra
命名空间或创建自定义组件
本手册覆盖了Reflex的核心功能,建议通过官方文档和示例项目深入学习更高级的用法。