flask的POST请求转换GET,解决分页问题

初学flask,之前只是用python写过一些简单的统计脚本,都是按照《FlaskWeb开发:基于Python的Web应用开发实战》这本书上的步骤敲出来的,作为练手,就想着把公司的通讯录用flask实现下,对于用户的展示、分页以及管理员登录等操作都没有遇到大的问题,仔细想想都能解决了。

但为了更加人性化,我想把搜索功能加到页面上,目标是下拉框中显示出现有的部门,选中部门提交后把对应部门的员工列出来,最开始使用的是POST,然后返回,第一页是完全正确的,但点击第二页时,请求变成了GET,会把所有的员工页的第二页展示出来,这就很纠结了,研究了一晚上,通过搜索找到了方法,把POST请求通过redirect_url的方式转换成GET请求,并把POST的参数传递给GET。

以下是我的view视图的代码:

@main.route('/', methods=['GET', 'POST'])
def index():
    form = Orderbydep()
    page = request.args.get('page', 1, type=int)
    department_name = request.args.get('department_name')
    if form.validate_on_submit() and request.method == 'POST':
        department_name = form.department_name.data
        return redirect(url_for('.index', department_name=department_name))
    elif department_name is None:
            page = request.args.get('page', 1, type=int)
            pagination = User.query.join(Department, User.department_id == Department.id).add_entity(Department).paginate(
                page, error_out=False)
            user = pagination.items
            dep = Department.query.all()
            return render_template('index.html', user=user, form=form, pagination=pagination,
                                   department_name=department_name)
    else:
        department_id = Department.query.filter_by(departmentname=department_name).first().id
        pagination = User.query.filter_by(department_id=department_id).paginate(
            page,
            error_out=False)
        user = pagination.items
        return render_template('index.html', user=user, form=form, pagination=pagination,
                               department_name=department_name)

Order_by的form代码:

class Orderbydep(FlaskForm):
    department_name = SelectField('员工部门')
    submit = SubmitField('submit')
    def __init__(self, *args, **kwargs):
        super(Orderbydep, self).__init__(*args, **kwargs)
        self.department_name.choices = [(department.departmentname, department.departmentname)
        for department in Department.query.order_by(Department.departmentname).all()]

直接请求时的GET是把所有的员工列出来,如果是通过POST转换的GET请求则把对应部门的员工列出来,这样就需要在模板里面分页相关加上POST传给GET的部门参数,通过url直接加参数方式查询数据并展示。

模板分页代码:

{{ macros.pagination_widget(pagination, '.index',department_name=department_name) }}

你可能感兴趣的:(flask的POST请求转换GET,解决分页问题)