You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:57:31