一、flask分页组件

  1. from urllib.parse import urlencode,quote,unquote
  2. class Pagination(object):
  3. """
  4. 自定义分页
  5. """
  6. def __init__(self,current_page,total_count,base_url,params,per_page_count=10,max_pager_count=11):
  7. try:
  8. current_page = int(current_page)
  9. except Exception as e:
  10. current_page = 1
  11. if current_page <=0:
  12. current_page = 1
  13. self.current_page = current_page
  14. # 数据总条数
  15. self.total_count = total_count
  16.  
  17. # 每页显示10条数据
  18. self.per_page_count = per_page_count
  19.  
  20. # 页面上应该显示的最大页码
  21. max_page_num, div = divmod(total_count, per_page_count)
  22. if div:
  23. max_page_num += 1
  24. self.max_page_num = max_page_num
  25.  
  26. # 页面上默认显示11个页码(当前页在中间)
  27. self.max_pager_count = max_pager_count
  28. self.half_max_pager_count = int((max_pager_count - 1) / 2)
  29.  
  30. # URL前缀
  31. self.base_url = base_url
  32.  
  33. # request.GET
  34. import copy
  35. params = copy.deepcopy(params)
  36. # params._mutable = True
  37. get_dict = params.to_dict()
  38. # 包含当前列表页面所有的搜/索条件
  39. # {source:[2,], status:[2], gender:[2],consultant:[1],page:[1]}
  40. # self.params[page] = 8
  41. # self.params.urlencode()
  42. # source=2&status=2&gender=2&consultant=1&page=8
  43. # href="/hosts/?source=2&status=2&gender=2&consultant=1&page=8"
  44. # href="%s?%s" %(self.base_url,self.params.urlencode())
  45. self.params = get_dict
  46.  
  47. @property
  48. def start(self):
  49. return (self.current_page - 1) * self.per_page_count
  50.  
  51. @property
  52. def end(self):
  53. return self.current_page * self.per_page_count
  54.  
  55. def page_html(self):
  56. # 如果总页数 <= 11
  57. if self.max_page_num <= self.max_pager_count:
  58. pager_start = 1
  59. pager_end = self.max_page_num
  60. # 如果总页数 > 11
  61. else:
  62. # 如果当前页 <= 5
  63. if self.current_page <= self.half_max_pager_count:
  64. pager_start = 1
  65. pager_end = self.max_pager_count
  66. else:
  67. # 当前页 + 5 > 总页码
  68. if (self.current_page + self.half_max_pager_count) > self.max_page_num:
  69. pager_end = self.max_page_num
  70. pager_start = self.max_page_num - self.max_pager_count + 1 #倒这数11个
  71. else:
  72. pager_start = self.current_page - self.half_max_pager_count
  73. pager_end = self.current_page + self.half_max_pager_count
  74.  
  75. page_html_list = []
  76. # {source:[2,], status:[2], gender:[2],consultant:[1],page:[1]}
  77. # 首页
  78. self.params['page'] = 1
  79. first_page = '<li><a href="%s?%s">首页</a></li>' % (self.base_url,urlencode(self.params),)
  80. page_html_list.append(first_page)
  81. # 上一页
  82. self.params["page"] = self.current_page - 1
  83. if self.params["page"] < 1:
  84. pervious_page = '<li class="disabled"><a href="%s?%s" aria-label="Previous">上一页</span></a></li>' % (self.base_url, urlencode(self.params))
  85. else:
  86. pervious_page = '<li><a href = "%s?%s" aria-label = "Previous" >上一页</span></a></li>' % ( self.base_url, urlencode(self.params))
  87. page_html_list.append(pervious_page)
  88. # 中间页码
  89. for i in range(pager_start, pager_end + 1):
  90. self.params['page'] = i
  91. if i == self.current_page:
  92. temp = '<li class="active"><a href="%s?%s">%s</a></li>' % (self.base_url,urlencode(self.params), i,)
  93. else:
  94. temp = '<li><a href="%s?%s">%s</a></li>' % (self.base_url,urlencode(self.params), i,)
  95. page_html_list.append(temp)
  96.  
  97. # 下一页
  98. self.params["page"] = self.current_page + 1
  99. if self.params["page"] > self.max_page_num:
  100. self.params["page"] = self.current_page
  101. next_page = '<li class="disabled"><a href = "%s?%s" aria-label = "Next">下一页</span></a></li >' % (self.base_url, urlencode(self.params))
  102. else:
  103. next_page = '<li><a href = "%s?%s" aria-label = "Next">下一页</span></a></li>' % (self.base_url, urlencode(self.params))
  104. page_html_list.append(next_page)
  105.  
  106. # 尾页
  107. self.params['page'] = self.max_page_num
  108. last_page = '<li><a href="%s?%s">尾页</a></li>' % (self.base_url, urlencode(self.params),)
  109. page_html_list.append(last_page)
  110.  
  111. return ''.join(page_html_list)

二、使用组件

  1. #!usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. from flask import Flask,render_template,request,redirect
  4. from pager import Pagination
  5. from urllib.parse import urlencode
  6. app = Flask(__name__)
  7.  
  8. =========================django的用法=======================================
  9. # pager_obj = Pagination(request.GET.get('page', 1), len(HOST_LIST), request.path_info, request.GET)
  10. # host_list = HOST_LIST[pager_obj.start:pager_obj.end]
  11. # html = pager_obj.page_html()
  12. # return render(request, 'hosts.html', {'host_list': host_list, "page_html": html})
  13.  
  14. @app.route('/pager')
  15. def pager():
  16. li = []
  17. for i in range(1,100):
  18. li.append(i)
  19. # print(li)
  20.   
  21.   ===================================flask的用法===============================
  22. pager_obj = Pagination(request.args.get("page",1),len(li),request.path,request.args,per_page_count=10)
  23. # print(request.args)
  24. index_list = li[pager_obj.start:pager_obj.end]
  25. html = pager_obj.page_html()
  26. return render_template("pager.html",index_list=index_list, html = html,condition=path)
  27.  
  28. if __name__ == '__main__':
  29. app.run(debug=True)

pager.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width">
  7. <title>Title</title>
  8. <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
  9. <style>
  10. .container{
  11. margin-top: 20px;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <div class="container">
  17. <a href="/add?{{ condition }}"><button class="btn btn-primary">添加</button></a>
  18. <div class="row " style="margin-top: 10px">
  19. <ul>
  20. {% for foo in index_list %}
  21. <li>{{ foo }}</li>
  22. {% endfor %}
  23. </ul>
  24. <nav aria-label="Page navigation" class="pull-right">
  25. <ul class="pagination">
  26. {{ html|safe }}
  27. </ul>
  28. </nav>
  29. </div>
  30. </div>
  31. </body>
  32. </html>

Flask系列(五)Flask实现分页的更多相关文章

  1. Flask系列(二)Flask基础

    知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref(django),werkzeug(flask),uwsgi(上线) 2.实例化Flask对象,里面是有参数的 app = F ...

  2. Flask系列(六)Flask实例化补充及信号

    一.实例化补充 instance_path和instance_relative_config是配合来用的. 这两个参数是用来找配置文件的,当用app.config.from_pyfile('setti ...

  3. flask系列五之flask_script

    1.一个简单的例子 在工程里面新建一个Python文件命名为manage.py (1)安装flask_script包,然后引入 from flask_script import Manager fro ...

  4. Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler

    一.使用 Flask中的特殊装饰器(中间件)方法常用的有三个 @app.before_request # 在请求进入视图函数之前 @app.after_request # 在请求结束视图函数之后 响应 ...

  5. Flask系列(四)Flask实现简单页面登陆

    from flask import Flask,render_template,request,redirect,session app = Flask(__name__,template_folde ...

  6. Flask 系列之 部署发布

    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过 Windows 的 WSL,将我们的项目网站部署到 ...

  7. 【Python】Flask系列-URL和视图笔记

    1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...

  8. flask系列三之Jinja2模板

    1.如何渲染模板 模板在‘templates’文件夹下(htnl页面) 从flask中导入render_template函数---渲染html模板 在视图函数中,使用render_template 函 ...

  9. flask系列二之基础知识

    一.调试模式(debug模式) 1.设置debug模式 在app.run()中传入关键字参数debug,app.run(debug=Ture),就设置当前项目为debug模式.如下所示: # 从fla ...

随机推荐

  1. mysqlbinlog工具的作用是什么呢,如何将binary log转换为文本格式?

    需求描述: 今天在看mysqlbinlog这个工具,就在想这个工具到底是干嘛的呢,在mysql数据库中, binary log中记录了数据库内容的变化或者说修改,这些修改是以二进制的方式存储到 bin ...

  2. webBrowser 模拟登录

    webBrowser1.Document.GetElementById("txtUsername").InnerText = "sdsy";//fill nam ...

  3. linux中的目录和文件的统计

    ls 目录 | wc -l find  ./   -type   d   |   wc   -l      //查找目录个数 find   ./   -type   f   |   wc   -l   ...

  4. hadoop程序MapReduce之DataSort

    需求:对文件中的数据进行排序. 样本:sort.log 10 13 10 20 输出:1 10 2 10 3 13 4 20 分析部分: mapper分析: 1.<k1,v1>k1代表:行 ...

  5. storm中的基本概念

    Storm是一个流计算框架,处理的数据是实时消息队列中的,所以需要我们写好一个topology逻辑放在那,接收进来的数据来处理,所以是通过移动数据平均分配到机器资源来获得高效率. Storm的优点是全 ...

  6. Kconfig和Makefile的修改

    Kconfig文件的作用 内核源码树的目录下都有两个文件Kconfig(2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconf ...

  7. thinkphp5.0开发规范

    命名规范 ThinkPHP5遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范: 目录和文件 目录不强制规范,驼峰及小写+下划线模式均支持: 类库.函数文件统一以.php为后缀: 类的文 ...

  8. 设计模式之模板方法模式(Java实现)

    "那个,上次由于我老婆要给我做饭,所以就没有说完就走掉了...这个那个".这次和以前一样,先来开场福利(工厂方法模式已被作者踹下场).由美女抽象工厂介绍一下适用场景~大家欢迎 抽象 ...

  9. 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 ...

  10. Fragments (官方文档中文版)

    转 http://blog.sina.com.cn/s/blog_69a4fbd70100r5j4.html   概述   Fragment表现Activity中UI的一个行为或者一部分.可以将多个f ...