如何从 Flask 中的输入中获取表单数据作为变量?

eri*_*rip 2 html python routes flask

我正在开发一个简单的用户界面来通过 ID 启动和停止游戏。我写的基本HTML如下(game_id由JS填充):

  <div align="center" class="top">
    <div align="left" class="game-id-input">
      Game ID: <input type="text" name="game_id" id="game_id">
    </div>

    <div align="right" class="buttons">
      <form action="{{ url_for('start_game', game_id=game_id) }}" method="get">
        <input type="submit" name="start" value="Start game" class="btn btn-success"></input>
      </form>
      <form action="{{ url_for('end_game', game_id=game_id) }}" method="get">
        <input type="submit" name="end" value="End game" class="btn btn-danger"></input>
      </form>
    </div>
  </div>
Run Code Online (Sandbox Code Playgroud)

看起来像

输入和按钮

我还为每种形式定义了 Flask 路由函数:

@app.route("/start_game/<game_id>")
def start_game(game_id):
    # ...

@app.route("/end_game/<game_id>")
def end_game(game_id):
    # ...
Run Code Online (Sandbox Code Playgroud)

在我的表单中,如何才能game_idgame_idfrom相对应#game_id

目前,当我提交开始和结束游戏时,我收到“文件未找到”错误,因为它只是将文字附加<game_id>到路线。

我是网络开发新手。这应该是微不足道的,但我不知道要搜索什么。提前抱歉问这么简单的问题。

dav*_*ism 5

您尝试根据用户输入生成 url,但当 Jinja 在服务器端渲染模板时,用户输入不可用,它仅在客户端可用。因此,如果您想将游戏 ID 作为 URL 参数发布到 URL,则必须使用 JavaScript 在客户端构建该 URL。

对于您想要做的事情来说,这并不是真正必要的。您可以使用 获取命名输入的提交值request.form['name']。按钮就像任何其他输入一样,因此您可以命名它们以了解所采取的操作。

@app.route('/manage_game', methods=['POST'])
def manage_game():
    start = request.form['action'] == 'Start'
    game_id = request.form['game_id']
    
    if start:
        start_game(game_id)
    else:
        stop_game(game_id)

    return redirect(url_for('index'))
Run Code Online (Sandbox Code Playgroud)
@app.route('/manage_game', methods=['POST'])
def manage_game():
    start = request.form['action'] == 'Start'
    game_id = request.form['game_id']
    
    if start:
        start_game(game_id)
    else:
        stop_game(game_id)

    return redirect(url_for('index'))
Run Code Online (Sandbox Code Playgroud)

即使这比您需要的更详细。鉴于您知道游戏是否已经在进行中,只需切换当前状态而不是选择操作。开始一个已经开始的游戏是没有意义的,只能停止它。