烧瓶形式不工作

问题描述:

我刚开始学习烧瓶,作为一个实践项目,我想建立一个简单的网站,要求用户输入他们的名字,并在新页面上用他们的名字打招呼。我一直无法通过表单获取用户的姓名,并且由于“错误的请求”错误而将其显示在新页面上。我的代码如下。烧瓶形式不工作

这是与它的形式,我的索引页:

<!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> 
+0

我认为这可能是问题,但在方法中包括POST也没有解决问题。我仍然收到'错误请求'错误。老实说,在智慧结尾:( –

+0

这很奇怪,你是否也编辑过表单方法?如果在'request.form'中没有找到'yourname',那么Flask会引发一个错误的请求错误 – Bovarysme

+1

哦,我完全忘了更改表单方法,现在一切都好了,谢谢! –

您需要将变量作为字典传递,而不是直接传递。

像这样

@app.route('/firstname') 
def first_name(): 
    yourname = request.form['yourname'] 
    return render_template('firstname.html', **{"name": "yourname"}) 
+1

这相当于将'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']