问题描述
在 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
hello,我也出现了同样的错误,查询第一页没问题,查询第二页也没问题,但是从第二页开始,搜索就报错,请问,你解决了吗?