烧瓶形式不工作
我刚开始学习烧瓶,作为一个实践项目,我想建立一个简单的网站,要求用户输入他们的名字,并在新页面上用他们的名字打招呼。我一直无法通过表单获取用户的姓名,并且由于“错误的请求”错误而将其显示在新页面上。我的代码如下。烧瓶形式不工作
这是与它的形式,我的索引页:
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
<h1>Practice index page</h1>
<h2>Welcome to my practice web page.</h2>
<form action = "/firstname">
<p>What's your name?</p>
<input type = "text" name = "yourname"><br>
<input type = "submit" value = "Submit">
</form>
</body>
</html>
这是我application.py文件:
from flask import Flask
from flask import render_template, request, redirect
app = Flask(__name__)
@app.route('/')
def hello_world():
return render_template('index.html')
@app.route('/firstname')
def first_name():
yourname = request.form['yourname']
return render_template('firstname.html', name = yourname)
这是我firstname.html文件:
<!DOCTYPE html>
<head>
<title>My name is</title>
</head>
<body>
<h1>Hello</h1>
<h2>Your name is {{name}}.</h2>
</body>
索引页加载正常。当用户的名字被硬编码时,firstname.html模板也可以正常加载,只有当我从问题出现的形式中得到它的时候。
我一直在这里呆了几个小时,看着YT的视频,疯了谷歌搜索,仍然无法弄清楚什么是错的,所以我非常感谢一些帮助!
默认情况下,瓶路线只回答GET请求。你可以告诉first_name
为了回答这两个GET和POST请求,像这样:
@app.route('/firstname', methods=['GET', 'POST'])
def first_name():
yourname = request.form['yourname']
return render_template('firstname.html', name = yourname)
您还需要设置表单方法为POST,这样yourname
为形式的数据(在request.form
可读)被发送,而不是作为一个URL参数(可在request.args
中阅读)。
<form action = "/firstname" method="POST">
<p>What's your name?</p>
<input type = "text" name = "yourname"><br>
<input type = "submit" value = "Submit">
</form>
您需要将变量作为字典传递,而不是直接传递。
像这样
@app.route('/firstname')
def first_name():
yourname = request.form['yourname']
return render_template('firstname.html', **{"name": "yourname"})
这相当于将'yourname'作为keyw ord参数。 – Bovarysme
使用request.args['yourname']
,而不是request.form['yourname']
您的index.html形式呼吁/姓名URL以get方法和name作为查询字符串
GET /firstname?yourname=Sunny HTTP/1.1
,所以你需要访问查询参数与request.args ['yourname'] & not with request.form ['yourname']
我认为这可能是问题,但在方法中包括POST也没有解决问题。我仍然收到'错误请求'错误。老实说,在智慧结尾:( –
这很奇怪,你是否也编辑过表单方法?如果在'request.form'中没有找到'yourname',那么Flask会引发一个错误的请求错误 – Bovarysme
哦,我完全忘了更改表单方法,现在一切都好了,谢谢! –