Flask分页参数在重定向时重置



因此,我试图用数据库中的前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请求是完全独立的,它不会记住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>

最新更新