[英]Flask sending info with GET when POST specified
我正在創建一個在線書店,但遇到了一個特定條目的問題。 當用戶購買一本書時,他們可以對其進行評分,並且此功能適用於他們購買的第一本書。 function 使用 POST 方法,表單傳入 book_id 和評級,然后我使用 SQLAlchemy 輸入數據庫。提交表單的 HTML 代碼是這樣的
<form action="/add_rating" method="POST">
<select name="rating" id="rating">
<option value="1">1</option>
<option value="3">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<button class="btn btn-success" id='adding_rating' name="book_id" type="submit" value='{{display_cart[book].book_id}}'>Rating</button>
</form>
如您所見,方法設置為 POST。 將評分錄入數據庫的后台函數/路由如下:
@app.route('/add_rating',methods=["POST"])
def add_rating():
if "cart" not in session:
flash("There is nothing in your cart.")
return render_template("cart.html", display_cart = {}, total = 0)
dict_of_books = {}
## getting user info
user = User.query.get(session['user_id'])
user_name = user.first_name + ' ' + user.last_name
##Get order history by user_id
order = get_order_history(session['user_id'])
dict_of_books = {}
total_price = 0
for i in range(len(order)):
total_price += order[i].total
book = get_book_by_id(order[i].book_id)
details = {'book_id': order[i].book_id, "title": book.title, "quantity": order[i].quantity, 'total': order[i].total}
dict_of_books[i] = details
book_id = request.form.get('book_id')
ratings = request.form.get('rating')
user_id = session['user_id']
add_rating = create_rating(ratings,book_id,user_id)
return render_template("rating.html", display_cart = dict_of_books, total = total_price, user_info = user_name)
現在,當我評價第一本書時,它通過 GET 將信息發送到 URL,但所有其他購買都通過 POST 發送。 第一本書的 output flask/sqlalchemy 給出的是"GET /rating?rating=3&book_id=4 HTTP/1.1" 200 -
但對於書籍的 rest 是"POST /add_rating HTTP/1.1" 200 -
。 /rating 路由基本上只是獲取有關購買書籍的信息並顯示到頁面,我沒有在路由中指定 GET/POST。 如果需要路線,我會在下面發布,但我無法想象它對這個問題有用。
@app.route('/rating')
def rate_book():
if "cart" not in session:
flash("There is nothing in your cart.")
return render_template("cart.html", display_cart = {}, total = 0)
dict_of_books = {}
## getting user info
user = User.query.get(session['user_id'])
user_name = user.first_name + ' ' + user.last_name
##Get order history by user_id
order = get_order_history(session['user_id'])
dict_of_books = {}
total_price = 0
for i in range(len(order)):
total_price += order[i].total
book = get_book_by_id(order[i].book_id)
details = {'book_id': order[i].book_id, "title": book.title, "quantity": order[i].quantity, 'total': order[i].total}
dict_of_books[i] = details
return render_template("rating.html", display_cart = dict_of_books, total = total_price, user_info = user_name)
我想通了這個問題,似乎我已經添加了一個“父”表單標簽,並在其中添加了另一個表單標簽來處理按鈕按下。 通過將第一個表單(沒有 method="POST")更改為一個 div 標簽,它解決了這個問題。 例子,原文:
<div class="container h-100">
<div class="row align-items-center h-100">
<div class="col-6 mx-auto">
<div style="display: flex; align-items: center;">
<form>
...
<form action="/add_rating" method="POST">
...
</form>
</div>
</div>
</div>
</div>
到
<div class="container h-100">
<div class="row align-items-center h-100">
<div class="col-6 mx-auto">
<div style="display: flex; align-items: center;">
<div>
...
<form action="/add_rating" method="POST">
...
</div>
</div>
</div>
</div>
</div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.