405在烧瓶中从GET到POST再到GET

  • 本文关键字:GET POST 再到 python flask
  • 更新时间 :
  • 英文 :


我从home.html开始,点击项目链接进入item.html。在item.html中,我单击删除按钮,提交删除表单,删除端点然后尝试重定向回home.html。这是405发生的时候。

127.0.0.1 - - [23/Apr/2022 15:12:55] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [23/Apr/2022 15:12:59] "GET /item/1 HTTP/1.1" 200 -
127.0.0.1 - - [23/Apr/2022 15:13:00] "POST /item/1/delete HTTP/1.1" 302 -
127.0.0.1 - - [23/Apr/2022 15:13:00] "submit=Delete+itemGET / HTTP/1.1" 405 -
pretending to delete 1

问题在WTForm,比较:

<form method="post" action="{{ url_for('delete_item', item_id=item_id) }}">     
<input type="submit" value="Submit">     
{{ delete_item_form.submit() }} 
</form>

WTForm提交导致问题,正常输入不会。

from flask import Flask, render_template, request, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import SubmitField
app = Flask(__name__)
app.config["SECRET_KEY"] = "unguessable"

class DeleteAnItemForm(FlaskForm):
submit = SubmitField("Delete item")

@app.route("/item/<int:item_id>/delete", methods=["POST"])
def delete_item(item_id):
print(f"pretending to delete {item_id}")
return redirect(url_for("home"))

@app.route("/item/<int:item_id>")
def item(item_id):
delete_item_form = DeleteAnItemForm()
return render_template('item.html', item_id=item_id, delete_item_form=delete_item_form)

@app.route("/")
def home():
return render_template('home.html')

home.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>HOME</p>
<ul>
<li><a href="{{ url_for('item', item_id=1) }}">1</a></li>
<li><a href="{{ url_for('item', item_id=2) }}">2</a></li>
<li><a href="{{ url_for('item', item_id=3) }}">3</a></li>
<li><a href="{{ url_for('item', item_id=4) }}">4</a></li>
<li><a href="{{ url_for('item', item_id=5) }}">5</a></li>
</ul>
</body>
</html>

item.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>Viewing item {{ item_id }}</p>
<form method="post" action="{{ url_for('delete_item', item_id=item_id) }}">
{{ delete_item_form.submit(class="btn btn-danger") }}
</form>
</body>
</html>

我已经找到了导致崩溃的原因,它没有任何意义:

<form method="post" action="{{ url_for('delete_item', item_id=item_id) }}">
<div>
works
<input type="submit" value="This works">
</div>
<br>
<br>
<div>
Both crash
{{ delete_item_form.submit() }}
<input id="submit" name="crashes" type="submit" value="Also crashes">
</div>
</form>

当输入字段有"name"属性崩溃发生,这是由WTForms自动完成的。知道为什么吗?

我在过去的几个小时里遇到了一个非常类似的问题,并发现了这个GitHub问题。从本质上讲,问题似乎归结于Flask的开发服务器,因为它在2.1中启用了keep-alive行为。

使用生产就绪的服务器(如waitress)不会引起问题。

在我的情况下,最简单的解决方法是将Werkzeuge降级到2.0.3。或者,始终使用数据也应该有所帮助。

最新更新