我正在开发一个简单的用户界面来启动和停止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
相对应?
目前,当我提交开始和结束游戏时,我会收到“找不到文件”错误,因为它只是将文字<game_id>
附加到路线上。
我是网络开发的新手。这应该是微不足道的,但我不知道该搜索什么。提前抱歉这么简单的问题。
答案 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>