【问题标题】:Flask sending info with GET when POST specified指定 POST 时,Flask 使用 GET 发送信息
【发布时间】:2021-03-13 19:53:02
【问题描述】:

我正在创建一家在线书店,但遇到了一个特定条目的问题。当用户购买一本书时,他们可以对其进行评分,并且此功能适用于他们购买的第一本书。该函数使用 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 发送。第一本书的输出烧瓶/sqlalchemy 是"GET /rating?rating=3&amp;book_id=4 HTTP/1.1" 200 -,但其余书籍的输出是"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)

【问题讨论】:

    标签: python flask sqlalchemy jinja2


    【解决方案1】:

    我发现了这个问题,似乎我添加了一个“父”表单标签,并在其中添加了另一个表单标签来处理按钮按下。通过将第一个表单(没有 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多