如何在Flask中将输入的表单数据作为变量?

时间:2016-02-17 18:55:11

标签: python html flask routes

我正在开发一个简单的用户界面来启动和停止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>

看起来像

input_and_buttons

我还为每种形式定义了Flask路线功能:

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

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

在我的表单中,如何使game_idgame_id中的#game_id相对应?

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

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

2 个答案:

答案 0 :(得分:3)

您正在尝试根据用户输入生成网址,但是当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'))
<form method="POST">
    <input type="text" name="game_id"/>
    <input type="submit" name="action" value="Start"/>
    <input type="submit" name="action" value="Stop"/>
</form>

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

答案 1 :(得分:0)

我无法评论,但我想更正 davidism的代码。 我相信你需要在你的表单元素中使用一个值来对应于服务器python代码中的函数以使其工作。轻微,但一个重要的纠正。所以它会是这样的:

在server.py中:

@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'))

在您的HTML中:

<form method="POST" action=/manage_game>
    <input type="text" name="game_id"/>
    <input type="submit" name="action" value="Start"/>
    <input type="submit" name="action" value="Stop"/>
</form>