烧瓶重定向不适用于通过开机自检提交的表单



>我正在尝试将表单(出现在我的books.html页面底部(请参阅下面的相关html((提交到/reviews路由,其中包含return redirect(url_for('reviews'))语句。但是,在提交表格时,我收到了405 Method Not Allowed Error

我检查了其他帖子,发现,是的,重定向与 POST 方法一起工作,交叉检查了我提交到达/books/reviews路线所需的表单的方法,以及它们的表单操作属性和与之相关的方法。一切似乎都很好。我仍然无法发现错误。

所需的行为是用户通过下面/books页面上的表单提交评论,页面将更新并显示评论、评级和平均评级。/reviews路由中的逻辑应执行处理和更新。

{% extends "layout.html" %}
{% block body %}
<div>
<table class="table">
<thead>
<tr>
<th><strong>Username</strong></th>
<th><strong>Review</strong></th>
<th class="text-center"><strong>Rating</strong></th>
</tr>
</thead>
{% for review in reviews %}
<tr>
<td>{{ review.username }}</td>
<td>{{ review.reviews }}</td>
<td class="text-center">{{ review.rating }}</td>
</tr>
{% endfor %}
<tfoot>
<tr>
<th>Average Rating</th>
<td colspan="1"></td>
<td class="text-center">{{ avg_rating }}</td>
</tr>
</tfoot>
</table>
</div>
<form action="{{ url_for('reviews') }}" method="post">
<fieldset>
<div class="form-group">
<div class="form-inline">
<label class="mr-3">Rate This Title & Write a Review</label>
<label class="mr-3 form-check-label">
<input type="radio" class="form-check-input" name="bookrating" id="onestar" value="1">
<i class="fas fa-star"></i>
</label>
</div>
<div class="form-group">
<input autocomplete="off" autofocus class="form-control" name="userreview" type="text"/>
<input autocomplete="off" autofocus class="form-control" name="bookid" value="{{ books.id }}" type="hidden"/>
</div>
<div class="form-group">
<button class="btn btn-primary" type="submit">Submit</button>
</div>
</fieldset>
</form>
{% endblock %}
@app.route("/reviews", methods=["POST"])
@login_required
def reviews():
book_id = request.form.get("bookid")
register_id = session["user_id"]
books = db.execute("SELECT * FROM books WHERE id = :id", {"id": book_id}).fetchone()
reviews = db.execute("SELECT register.username, reviews, rating FROM reviews JOIN register ON reviews.book_id = :id AND reviews.user_id = register.id", {"id": book_id})
avg_rating = db.execute("SELECT ROUND(AVG(rating),0) FROM reviews WHERE book_id = :book_id", {"book_id": book_id}).scalar()
user_reviews = db.execute("SELECT * FROM reviews WHERE user_id = :id AND book_id = :book_id", {"id": register_id, "book_id": book_id}).fetchone()
if not user_reviews:
target_review = request.form.get("userreview")
db.execute("INSERT INTO reviews (book_id, reviews, user_id) VALUES (:book_id, :reviews, :user_id)", {"book_id": book_id, "reviews": target_review, "user_id": register_id})
db.commit()
return redirect(url_for('reviews'))
else:
return render_template("books.html", books=books, reviews=reviews)

你能尝试在你的方法中添加"GET"吗:

@app.route("/reviews", methods=["GET", "POST"])
@login_required
def reviews():
book_id = request.form.get("bookid")
register_id = session["user_id"]

可能是在烧瓶中实现重定向将请求更改为 GET 请求,而您的评论路由不允许这样做

这是因为您想重定向到评论功能(即路线/评论(。但是您的方法只会发布。我相信重定向需要GET方法来加载一些页面。

最新更新