python flask 分页_Python 的 Flask 框架用 paginate 分页返回404?

博客围绕 Python Flask 分页查询问题展开。在 index 页面查询 email 结果分页时,点击分页出现 404 错误。作者将查询关键字存于 session,点击分页从 session 读取查询,但 paginate() 报错。还给出了相关代码及环境版本信息,如 Python 3.7.1、Flask 1.0.2 等。

问题描述

在 index 页面有一个表单,用于查询 email 并将查询结果返回到该页面,并分页.提交表单后,结果确实分页了,但是点击任何分页都是404错误页。

你期待的结果是什么?

index 页提交查询表单,然后在 index 页显示结果,结果正确分页。

相关代码

源代码:https://github.com/wedojava/e…

main/index.py

:

from flask import render_template, flash, redirect, url_for, request, g, current_app, session

from app.main import bp

from app.main.forms import SearchForm

@bp.before_app_request

def before_request():

if current_user.is_authenticated:

current_user.last_seen = datetime.utcnow()

db.session.commit()

try:

session['email'] = session['email'] if session['email'] else 'example@example.com'

except KeyError as ke:

session['email'] = 'example@example.com'

@bp.route('/', methods=['GET', 'POST'])

@bp.route('/index', methods=['GET', 'POST'])

def index():

form = SearchForm()

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

if form.validate_on_submit():

words_email = ["%" + form.email.data + "%"]

rule_email = and_(*[LogImported.sender_address.like(w) for w in words_email])

# pay attention these two lines below:

l = LogImported.query.filter(rule_email)

pagination = l.paginate(page, per_page=50, error_out=True)

pageitems = pagination.items

session['email'] = form.email.data

return render_template('index.html', title=_('Home'), form=form, loglist = l, \

pageitems = pageitems, pagination = pagination)

elif session['email'] is not 'example@example.com':

words_email = ["%" + form.email.data + "%"]

rule_email = and_(*[LogImported.sender_address.like(w) for w in words_email])

# pay attention these two lines below:

l = LogImported.query.filter(rule_email)

pagination = l.paginate(page, per_page=50, error_out=True)

pageitems = pagination.items

session['email'] = form.email.data

return render_template('index.html', title=_('Home'), form=form, loglist = l, \

pageitems = pageitems, pagination = pagination)

else:

return render_template('index.html', title=_('Home'), form=form)

main/forms.py

:

class SearchForm(FlaskForm):

email = StringField(_l('Email'))

ip = StringField('IP', validators=[Length(min=0, max=140)])

submit = SubmitField(_l('Submit'))

main/__init__.py

:

from flask import Blueprint

bp = Blueprint('main', __name__)

from app.main import routes

/models.py

:

class LogImported(db.Model):

id = db.Column(db.Integer, index=True, primary_key=True)

date = db.Column(db.DateTime, default=datetime.utcnow)

sender_address = db.Column(db.String(255), index=True)

recipient_address = db.Column(db.String(255))

recipient_count = db.Column(db.Integer)

return_path = db.Column(db.String(255))

client_hostname = db.Column(db.String(255))

client_ip = db.Column(db.String(100))

server_hostname = db.Column(db.String(255))

server_ip = db.Column(db.String(100))

original_client_ip = db.Column(db.String(100))

original_server_ip = db.Column(db.String(100))

event_id = db.Column(db.String(50))

total_bytes = db.Column(db.Integer)

connector_id = db.Column(db.String(50))

message_subject = db.Column(db.String(255))

source = db.Column(db.String(50))

templates/index.html

:

{% extends "base.html" %}

{% from 'bootstrap/form.html' import render_form %}

{% from 'bootstrap/pagination.html' import render_pagination %}

...

{{ render_pagination(pagination) }}

...

结果分页会404

从 index 页面查询,把获得的结果集分页,但是点击分页就报错404。

我把查询关键字放到 session 里,然后点击分页的时候,从session读取关键字,查询,把结果交给分页函数去分页,但是

paginate()

会报错。类似

http://127.0.0.1:5000/index?page=2

,会返回404错误页面。

elif

in routes.py:

l = LogImported.query.filter(rule)

pagination = l.paginate(page, per_page=50, error_out=True)

l = LogImported.query.filter(rule)

的类型是对的,但是

l.paginate(page, per_page=50, error_out=True)

会报错,结果都取到了,分页就出错了。if 里写的可以,elif里一模一样的就不能行。

实际看到的错误信息又是什么?

127.0.0.1 - - [11/Dec/2018 12:44:51] "GET /index?page=2 HTTP/1.1" 404 -

问题出现的环境背景及自己尝试过哪些方法

Python version: 3.7.1

Flask version:1.0.2

Werkzeug version:0.14.1

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值