【问题标题】:Flask pagination arg resets on redirectFlask 分页参数在重定向时重置
【发布时间】:2022-01-24 13:44:24
【问题描述】:

所以我正在尝试使用我的数据库中的前 20 个“事件”设置一个索引页面,并可以选择进一步或后退。 这是我的代码:

@app.route('/', methods=['GET', 'POST'])
def index():

    page = int(request.args.get('page', default=1, type=int))
    print("page is " + str(page))
    page_backwards = str((page - 1))
    print("page_backwards is " + page_backwards)
    page_forwards = str((page + 1))
    print("page_fowards is " + page_forwards)


    if request.method == 'GET':

        offset = int(20 * (page - 1))
        cursor = connection.cursor()

        if page <= 0:
            return redirect('/?page=1')

        if page == 1:
            events = cursor.execute(
                "SELECT name, date, time, venue, id FROM events ORDER BY date ASC LIMIT 20").fetchall()
            
        elif page > 1:
            events = cursor.execute(
                "SELECT name, date, time, venue, id FROM events ORDER BY date ASC LIMIT 20 OFFSET ?", (offset,)).fetchall()
        return render_template("index.html", events=events)

    if request.method == 'POST':

        if 'previous' in request.form:
            print("POST" + page_backwards)
            return redirect('/?page=' + page_backwards)
        elif 'next' in request.form:
            print("POST "+ page_forwards)
            return redirect('/?page=' + page_forwards)

它会更简洁,但我正在尝试调试它,这就是 page_backwards 等位于顶部的原因。

莫名其妙的部分是什么?

    if request.method == 'POST':

        if 'previous' in request.form:
            print("POST" + page_backwards)
            return redirect('/?page=' + page_backwards)
        elif 'next' in request.form:
            print("POST "+ page_forwards)
            return redirect('/?page=' + page_forwards)

这里的打印部分运行良好,它打印出正确的页面,但由于某种原因,返回重定向行为异常并被锁定到 1 和 2。

发生了什么:单击 PREVIOUS/NEXT 按钮后,它会将页面变量减去/添加 1,然后将该变量添加为参数。变量已正确更新,但无论发生什么,返回总是重定向到第 0 页(然后转到第 1 页)或第 2 页!!

这真是莫名其妙:

page is 5
page_backwards is 4
page_fowards is 6
127.0.0.1 - - [23/Dec/2021 16:29:49] "GET /?page=5 HTTP/1.1" 200 -
[...]
page is 1
page_backwards is 0
page_fowards is 2
POST 2
127.0.0.1 - - [23/Dec/2021 16:29:52] "POST / HTTP/1.1" 302 -
page is 2
page_backwards is 1
page_fowards is 3
127.0.0.1 - - [23/Dec/2021 16:29:52] "GET /?page=2 HTTP/1.1" 200 -

【问题讨论】:

  • 据我了解,POST 请求似乎正在重置页面变量,因此默认为 1。我怎样才能阻止这种情况发生?

标签: python flask


【解决方案1】:

我想通了,POST 请求是完全独立的,它不会记住 URL 参数,因此将它们重置为默认值。最后我做了一个更干净的解决方法:

@app.route('/')
def index():

    page = int(request.args.get('page', default=1, type=int))

    offset = int(20 * (page - 1))
    cursor = connection.cursor()

    if page <= 0:
        return redirect('/?page=1')

    if page == 1:
        events = cursor.execute(
            "SELECT name, date, time, venue, id FROM events ORDER BY date ASC LIMIT 20").fetchall()
            
    elif page > 1:
        events = cursor.execute(
            "SELECT name, date, time, venue, id FROM events ORDER BY date ASC LIMIT 20 OFFSET ?", (offset,)).fetchall()
    return render_template("index.html", events=events, previous=str(page-1), next=str(page+1))

使用以下 HTML 代码:

  <form action="/" method="GET">
    <button name="page" value = "{{ previous }}"
      class="inline-flex items-center py-2 px-4 mr-3 text-sm font-medium text-gray-500 bg-white rounded-lg border border-gray-300 hover:bg-gray-100 hover:text-gray-700">
      ← Previous
    </button>
    <button name="page" value="{{ next }}"
      class="inline-flex items-center py-2 px-4 text-sm font-medium text-gray-500 bg-white rounded-lg border border-gray-300 hover:bg-gray-100 hover:text-gray-700">
      Next →

    </button>

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2012-12-25
    相关资源
    最近更新 更多