【问题标题】:How to get form data from input as variable in Flask?如何从输入中获取表单数据作为Flask中的变量?
【发布时间】:2016-05-29 15:55:51
【问题描述】:

我正在开发一个简单的用户界面来通过 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>

看起来像

我还为每个表单定义了 Flask 路由函数:

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

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

在我的表单中,如何使game_id 对应于#game_id 中的game_id

目前,当我提交开始和结束游戏时,我收到一个 File Not Found 错误,因为它只是将文字 &lt;game_id&gt; 附加到路由。

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

【问题讨论】:

    标签: python html flask routes


    【解决方案1】:

    您正在尝试根据用户输入生成一个 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'))
    
    <form method="POST" action="{{ url_for('manage_game') }}">
        <input type="text" name="game_id"/>
        <input type="submit" name="action" value="Start"/>
        <input type="submit" name="action" value="Stop"/>
    </form>
    

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

    【讨论】:

      【解决方案2】:

      我无法发表评论,但我想更正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>
      

      【讨论】:

      • @erip,澄清一下,'game_id' 值实际上是通过表单上方的 HTML 代码传递给表单元素的,但通过代码中其他地方的 JS 定义,无论是在 HTML 标头还是其他单独的文件。所以从这里开始:
        游戏 ID:
        到:
        你使用了输入元素的名字。 game_id 传递 val。
      猜你喜欢
      • 1970-01-01
      • 2014-01-30
      • 2022-01-04
      • 1970-01-01
      • 2019-04-11
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      相关资源
      最近更新 更多