Flask系列(五)Flask实现分页
一、flask分页组件
- from urllib.parse import urlencode,quote,unquote
- class Pagination(object):
- """
- 自定义分页
- """
- def __init__(self,current_page,total_count,base_url,params,per_page_count=10,max_pager_count=11):
- try:
- current_page = int(current_page)
- except Exception as e:
- current_page = 1
- if current_page <=0:
- current_page = 1
- self.current_page = current_page
- # 数据总条数
- self.total_count = total_count
- # 每页显示10条数据
- self.per_page_count = per_page_count
- # 页面上应该显示的最大页码
- max_page_num, div = divmod(total_count, per_page_count)
- if div:
- max_page_num += 1
- self.max_page_num = max_page_num
- # 页面上默认显示11个页码(当前页在中间)
- self.max_pager_count = max_pager_count
- self.half_max_pager_count = int((max_pager_count - 1) / 2)
- # URL前缀
- self.base_url = base_url
- # request.GET
- import copy
- params = copy.deepcopy(params)
- # params._mutable = True
- get_dict = params.to_dict()
- # 包含当前列表页面所有的搜/索条件
- # {source:[2,], status:[2], gender:[2],consultant:[1],page:[1]}
- # self.params[page] = 8
- # self.params.urlencode()
- # source=2&status=2&gender=2&consultant=1&page=8
- # href="/hosts/?source=2&status=2&gender=2&consultant=1&page=8"
- # href="%s?%s" %(self.base_url,self.params.urlencode())
- self.params = get_dict
- @property
- def start(self):
- return (self.current_page - 1) * self.per_page_count
- @property
- def end(self):
- return self.current_page * self.per_page_count
- def page_html(self):
- # 如果总页数 <= 11
- if self.max_page_num <= self.max_pager_count:
- pager_start = 1
- pager_end = self.max_page_num
- # 如果总页数 > 11
- else:
- # 如果当前页 <= 5
- if self.current_page <= self.half_max_pager_count:
- pager_start = 1
- pager_end = self.max_pager_count
- else:
- # 当前页 + 5 > 总页码
- if (self.current_page + self.half_max_pager_count) > self.max_page_num:
- pager_end = self.max_page_num
- pager_start = self.max_page_num - self.max_pager_count + 1 #倒这数11个
- else:
- pager_start = self.current_page - self.half_max_pager_count
- pager_end = self.current_page + self.half_max_pager_count
- page_html_list = []
- # {source:[2,], status:[2], gender:[2],consultant:[1],page:[1]}
- # 首页
- self.params['page'] = 1
- first_page = '<li><a href="%s?%s">首页</a></li>' % (self.base_url,urlencode(self.params),)
- page_html_list.append(first_page)
- # 上一页
- self.params["page"] = self.current_page - 1
- if self.params["page"] < 1:
- pervious_page = '<li class="disabled"><a href="%s?%s" aria-label="Previous">上一页</span></a></li>' % (self.base_url, urlencode(self.params))
- else:
- pervious_page = '<li><a href = "%s?%s" aria-label = "Previous" >上一页</span></a></li>' % ( self.base_url, urlencode(self.params))
- page_html_list.append(pervious_page)
- # 中间页码
- for i in range(pager_start, pager_end + 1):
- self.params['page'] = i
- if i == self.current_page:
- temp = '<li class="active"><a href="%s?%s">%s</a></li>' % (self.base_url,urlencode(self.params), i,)
- else:
- temp = '<li><a href="%s?%s">%s</a></li>' % (self.base_url,urlencode(self.params), i,)
- page_html_list.append(temp)
- # 下一页
- self.params["page"] = self.current_page + 1
- if self.params["page"] > self.max_page_num:
- self.params["page"] = self.current_page
- next_page = '<li class="disabled"><a href = "%s?%s" aria-label = "Next">下一页</span></a></li >' % (self.base_url, urlencode(self.params))
- else:
- next_page = '<li><a href = "%s?%s" aria-label = "Next">下一页</span></a></li>' % (self.base_url, urlencode(self.params))
- page_html_list.append(next_page)
- # 尾页
- self.params['page'] = self.max_page_num
- last_page = '<li><a href="%s?%s">尾页</a></li>' % (self.base_url, urlencode(self.params),)
- page_html_list.append(last_page)
- return ''.join(page_html_list)
二、使用组件
- #!usr/bin/env python
- # -*- coding:utf-8 -*-
- from flask import Flask,render_template,request,redirect
- from pager import Pagination
- from urllib.parse import urlencode
- app = Flask(__name__)
- =========================django的用法=======================================
- # pager_obj = Pagination(request.GET.get('page', 1), len(HOST_LIST), request.path_info, request.GET)
- # host_list = HOST_LIST[pager_obj.start:pager_obj.end]
- # html = pager_obj.page_html()
- # return render(request, 'hosts.html', {'host_list': host_list, "page_html": html})
- @app.route('/pager')
- def pager():
- li = []
- for i in range(1,100):
- li.append(i)
- # print(li)
- ===================================flask的用法===============================
- pager_obj = Pagination(request.args.get("page",1),len(li),request.path,request.args,per_page_count=10)
- # print(request.args)
- index_list = li[pager_obj.start:pager_obj.end]
- html = pager_obj.page_html()
- return render_template("pager.html",index_list=index_list, html = html,condition=path)
- if __name__ == '__main__':
- app.run(debug=True)
pager.html
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width">
- <title>Title</title>
- <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
- <style>
- .container{
- margin-top: 20px;
- }
- </style>
- </head>
- <body>
- <div class="container">
- <a href="/add?{{ condition }}"><button class="btn btn-primary">添加</button></a>
- <div class="row " style="margin-top: 10px">
- <ul>
- {% for foo in index_list %}
- <li>{{ foo }}</li>
- {% endfor %}
- </ul>
- <nav aria-label="Page navigation" class="pull-right">
- <ul class="pagination">
- {{ html|safe }}
- </ul>
- </nav>
- </div>
- </div>
- </body>
- </html>
Flask系列(五)Flask实现分页的更多相关文章
- Flask系列(二)Flask基础
知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref(django),werkzeug(flask),uwsgi(上线) 2.实例化Flask对象,里面是有参数的 app = F ...
- Flask系列(六)Flask实例化补充及信号
一.实例化补充 instance_path和instance_relative_config是配合来用的. 这两个参数是用来找配置文件的,当用app.config.from_pyfile('setti ...
- flask系列五之flask_script
1.一个简单的例子 在工程里面新建一个Python文件命名为manage.py (1)安装flask_script包,然后引入 from flask_script import Manager fro ...
- Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler
一.使用 Flask中的特殊装饰器(中间件)方法常用的有三个 @app.before_request # 在请求进入视图函数之前 @app.after_request # 在请求结束视图函数之后 响应 ...
- Flask系列(四)Flask实现简单页面登陆
from flask import Flask,render_template,request,redirect,session app = Flask(__name__,template_folde ...
- Flask 系列之 部署发布
说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过 Windows 的 WSL,将我们的项目网站部署到 ...
- 【Python】Flask系列-URL和视图笔记
1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...
- flask系列三之Jinja2模板
1.如何渲染模板 模板在‘templates’文件夹下(htnl页面) 从flask中导入render_template函数---渲染html模板 在视图函数中,使用render_template 函 ...
- flask系列二之基础知识
一.调试模式(debug模式) 1.设置debug模式 在app.run()中传入关键字参数debug,app.run(debug=Ture),就设置当前项目为debug模式.如下所示: # 从fla ...
随机推荐
- mysqlbinlog工具的作用是什么呢,如何将binary log转换为文本格式?
需求描述: 今天在看mysqlbinlog这个工具,就在想这个工具到底是干嘛的呢,在mysql数据库中, binary log中记录了数据库内容的变化或者说修改,这些修改是以二进制的方式存储到 bin ...
- webBrowser 模拟登录
webBrowser1.Document.GetElementById("txtUsername").InnerText = "sdsy";//fill nam ...
- linux中的目录和文件的统计
ls 目录 | wc -l find ./ -type d | wc -l //查找目录个数 find ./ -type f | wc -l ...
- hadoop程序MapReduce之DataSort
需求:对文件中的数据进行排序. 样本:sort.log 10 13 10 20 输出:1 10 2 10 3 13 4 20 分析部分: mapper分析: 1.<k1,v1>k1代表:行 ...
- storm中的基本概念
Storm是一个流计算框架,处理的数据是实时消息队列中的,所以需要我们写好一个topology逻辑放在那,接收进来的数据来处理,所以是通过移动数据平均分配到机器资源来获得高效率. Storm的优点是全 ...
- Kconfig和Makefile的修改
Kconfig文件的作用 内核源码树的目录下都有两个文件Kconfig(2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconf ...
- thinkphp5.0开发规范
命名规范 ThinkPHP5遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范: 目录和文件 目录不强制规范,驼峰及小写+下划线模式均支持: 类库.函数文件统一以.php为后缀: 类的文 ...
- 设计模式之模板方法模式(Java实现)
"那个,上次由于我老婆要给我做饭,所以就没有说完就走掉了...这个那个".这次和以前一样,先来开场福利(工厂方法模式已被作者踹下场).由美女抽象工厂介绍一下适用场景~大家欢迎 抽象 ...
- LeetCode——Convert Sorted Array to Binary Search Tree
Description: Given an array where elements are sorted in ascending order, convert it to a height bal ...
- Fragments (官方文档中文版)
转 http://blog.sina.com.cn/s/blog_69a4fbd70100r5j4.html 概述 Fragment表现Activity中UI的一个行为或者一部分.可以将多个f ...