簡體   English   中英

Flask 指定 POST 時使用 GET 發送信息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM