首页 > 编程问答 >1 个 html 文件中有 2 个表单会引发错误:400 Bad Request (flask)

1 个 html 文件中有 2 个表单会引发错误:400 Bad Request (flask)

时间:2024-07-28 05:29:24浏览次数:13  
标签:python html flask

我最近开始学习 Flask,遇到了一个问题,当 1 个 html 文件有 2 个可以提交的表单时会发生这种情况。当只有一种表单时,不会发生此问题。

这是我包含flask的python文件:

from flask import Flask, request, render_template

app = Flask(__name__)
app.secret_key = 'secretkry'

@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "POST":
        if request.form["form_button_1"]:
            return render_template('index.html', test_id="pressed form nr 1")
        if request.form["form_button_2"]:
            return render_template('index.html', test_id="pressed form nr 2")

    return render_template('index.html', test_id="hasnt yet pressed form button")

if __name__ == '__main__':
    app.run(port=44444)

这是我的index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="#" method="post">
    <button name="form_button_1" type="submit" value="random_value1">form button 1</button>
</form>

<br>

<form action="#" method="post">
    <button name="form_button_2" type="submit" value="random_value2">form button 2</button>
</form>

<p>{{test_id}}</p>

</body>
</html>

当我运行此文件时,我收到错误:400 Bad Request。当我在 index.html 中只有 1 个表单时,不会发生这种情况 (index.html 看起来像这样)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="#" method="post">
    <button name="form_button_1" type="submit" value="random_value1">form button 1</button>
</form>

<br>

<p>{{test_id}}</p>

</body>
</html>

包含 Flask 的 python 文件看起来像这样

from flask import Flask, request, render_template

app = Flask(__name__)
app.secret_key = 'secretkry'

@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "POST":
        if request.form["form_button_1"]:
            return render_template('index.html', test_id="pressed form nr 1")

    return render_template('index.html', test_id="hasnt yet pressed form button")

if __name__ == '__main__':
    app.run(port=44444)

同样,第一个示例不起作用,但第二个示例(只有 1 种形式)起作用。 我想知道当存在 2 个表单时如何提交单击的表单。我使用的是 Kali Linux,如果这有什么不同的话。提前致谢


出现 “400 Bad Request” 错误的原因是,当提交任何一个表单时,Flask 都试图同时访问两个按钮的 request.form 数据。如果一个按钮没有被按下,它的名字就不会出现在 request.form 中,从而导致错误。

解决这个问题的方法是,在检查按钮名称是否存在于 request.form 中之前,先检查它:

from flask import Flask, request, render_template

app = Flask(__name__)
app.secret_key = 'secretkry'

@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "POST":
        if "form_button_1" in request.form:
            return render_template('index.html', test_id="pressed form nr 1")
        elif "form_button_2" in request.form:
            return render_template('index.html', test_id="pressed form nr 2")

    return render_template('index.html', test_id="hasnt yet pressed form button")

if __name__ == '__main__':
    app.run(port=44444)

在这个改进后的代码中:

  1. 我们使用 if "form_button_1" in request.form: elif "form_button_2" in request.form: 来分别检查每个按钮名称是否存在于 request.form 字典中。
  2. 只有当按钮名称存在于 request.form 中时,我们才会执行相应的代码块。

这样就解决了 “400 Bad Request” 错误,并且的 Flask 应用现在可以正确处理来自两个表单的提交。

标签:python,html,flask
From: 78802508

相关文章

  • Python 中的“样板”代码?
    Google有一个Python教程,他们将样板代码描述为“不幸的”,并提供了以下示例:#!/usr/bin/python#importmodulesusedhere--sysisaverystandardoneimportsys#Gatherourcodeinamain()functiondefmain():print'Hellothere',sys.argv[1]#Command......
  • Python 3.9.1 中的 collections.abc.Callable 是否有 bug?
    Python3.9包含PEP585并弃用typing模块中的许多类型,转而支持collections.abc中的类型,现在它们支持__class_getitem__例如Callable就是这种情况。对我来说,typing.Callable和collections.abc.Ca......
  • 当我尝试使用 HTMLSession 渲染 JavaScript 时,出现错误
    我尝试使用HTMLSession渲染JavaScript,但是当我尝试时它给了我一个错误。>>>r.html.render()Futureexceptionwasneverretrievedfuture:<Futurefinishedexception=NetworkError('ProtocolerrorTarget.detachFromTarget:Targetclosed.')>pyppeteer.error......
  • 列表子类的 Python 类型
    我希望能够定义列表子类的内容必须是什么。该类如下所示。classA(list):def__init__(self):list.__init__(self)我想包含键入内容,以便发生以下情况。importtypingclassA(list:typing.List[str]):#Maybesomethinglikethisdef__init__(self):......
  • Python 中类型友好的委托
    考虑以下代码示例defsum(a:int,b:int):returna+bdefwrap(*args,**kwargs):#delegatetosumreturnsum(*args,**kwargs)该代码运行良好,只是类型提示丢失了。在Python中使用*args,**kwargs来实现​​委托模式是很常见的。如果有一种方法可......
  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......
  • 如何在Python 3.12+中正确使用泛型来提高代码质量?
    我正在尝试使用泛型来改进FastAPI应用程序中的类型注释。我有一个抽象存储库类,在其中使用泛型:fromabcimportABC,abstractmethodfromtypingimportListclassAbstractRepository[T](ABC):@abstractmethodasyncdefadd_one(self,data:dict)->T:......
  • python中的while循环不退出
    我试图完成第一年的python商业课程作业,但我的while循环无法退出,有人能帮忙吗?commisionTable=[{"admin_fee":100,"comm_rate":0.10},{"admin_fee":125,"comm_rate":0.12},{"admin_fee":150,"comm_rate":......
  • python---json文件写入
    ​ 使用到的知识点:os模块执行linux指令、json.dump()、withopenasf代码实现importsysimportosimportjson #向json文件file中添加内容data,其中data的类型为字典defwrite_json(file,data):    #如果文件存在,则删除    if(os.path.exists(fi......
  • python错题记录:布尔运算与逻辑值检测
    一前言环境:python3.10win10二布尔运算与逻辑值检测1案例案例1如上,在布尔运算时,有些时候代码只会运算前面的一部分,剩下的部分根本不会运算。以前在练习算法代码时,就利用这个规则来减少代码的工作量案例2如上,之前好长一段时间,上面的布尔运算总是让我感到困惑布尔运......