如何通过Starlette将HTML输入与Python关联并读取表单数据?
解决Starlette中HTML表单数据读取与按钮检测问题
第一步:确保HTML表单符合要求
你的现有HTML表单需要满足两个核心要求,Starlette才能正确读取数据:
- 表单标签设置
method="POST",action指向你的Starlette路由(比如/submit-event) - 所有需要读取的文本框、按钮都必须设置
name属性(这是后端识别数据的唯一标识)
示例表单片段:
<form method="POST" action="/submit-event"> <input type="text" name="event_title" placeholder="事件标题"> <input type="datetime-local" name="event_time" placeholder="事件时间"> <textarea name="event_desc" placeholder="事件描述"></textarea> <!-- 带name的提交按钮,用于检测触发动作 --> <button type="submit" name="action" value="save_event">保存事件</button> <button type="submit" name="action" value="preview_event">预览事件</button> </form>
第二步:Starlette后端实现数据读取与按钮检测
1. 基础路由与依赖导入
先导入Starlette核心模块,初始化应用:
from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import HTMLResponse, RedirectResponse from starlette.routing import Route # 假设你的HTML页面文件名为calendar.html,返回页面的路由 async def homepage(request): with open("calendar.html", "r", encoding="utf-8") as f: html_content = f.read() return HTMLResponse(html_content)
2. 处理表单提交的核心逻辑
编写路由函数读取表单数据,并检测按钮动作:
async def handle_event_submit(request: Request): # 读取POST表单数据,返回类似字典的FormData对象 form_data = await request.form() # 1. 读取文本框数据,转成变量 event_title = form_data.get("event_title", "") # 第二个参数为默认值,避免KeyError event_time = form_data.get("event_time", "") event_desc = form_data.get("event_desc", "") # 2. 检测按钮触发的动作 action = form_data.get("action") if action == "save_event": # 直接传入你的SQL逻辑(示例,实际用参数化查询防注入) # execute_sql("INSERT INTO events (title, time, desc) VALUES (%s, %s, %s)", (event_title, event_time, event_desc)) print("保存事件:", event_title, event_time, event_desc) return RedirectResponse(url="/", status_code=303) elif action == "preview_event": # 预览逻辑示例 preview_html = f"<h1>预览事件</h1><p>标题:{event_title}</p><p>时间:{event_time}</p><p>描述:{event_desc}</p><a href='/'>返回</a>" return HTMLResponse(preview_html) else: return RedirectResponse(url="/", status_code=303)
3. 注册路由并启动应用
把路由注册到Starlette应用,然后启动:
routes = [ Route("/", endpoint=homepage), Route("/submit-event", endpoint=handle_event_submit, methods=["POST"]) ] app = Starlette(routes=routes) # 启动命令:uvicorn main:app --reload
关键注意事项
- 必须使用
await request.form()读取POST表单数据,Starlette请求处理为异步模式 - 表单控件的
name属性要和后端读取的键完全一致(大小写敏感) - 若用GET请求提交数据(不推荐),可通过
request.query_params.get("xxx")读取 - 处理SQL务必用参数化查询,避免注入风险
内容的提问来源于stack exchange,提问作者Nicholas Tucker
相关产品推荐
相关产品推荐

