python全栈系列之---自定义分页类

# coding:utf8
# __author:  Administrator
# date:      2018/3/7 0007
# /usr/bin/env python
import tornado.web
from math import ceil

LIST_INFO =[
    {‘username‘:‘ld‘,"email":‘[email protected]‘},
]

class Pagination:
    #传入当前页,总条数
    def __init__(self,current_page,total_num):
        try:
            current_page = int(current_page)
        except:
            current_page = 1
        if current_page < 1:
            current_page = 1
        #总条数
        self.total_num=total_num
        #默认每页显示内容
        self.page_size=5
        #默认分页栏显示几页
        self.page_show_num=11
        #当前页
        self.current_page=current_page
        #总页数
        self.total_page=ceil(total_num/self.page_size)
        #当前路径
        self.base_url=‘/index/‘

    #设置当前路径
    @property
    def set_base_url(self,base_url):
        self.base_url=base_url

    #设置页面显示条数
    @property
    def set_size(self,page_size):
        self.page_size=page_size

    #设置分页类显示数量
    @property
    def set_page_show_num(self,page_show_num):
        self.page_show_num=page_show_num

    #设置总页数
    @property
    def set_total(self,page_total):
        self.total_page=page_total

    #获取分页栏的页数范围,返回列表
    def get_list(self):
        cur = (self.current_page - 1) * self.page_size
        show_page = []
        mid_page=int(self.page_show_num/2)
        if self.total_page <= self.page_show_num:
            show_page = range(1, self.total_page + 1)
        else:
            if self.current_page <= mid_page:
                show_page = range(1, self.page_show_num+1)
            elif self.current_page + mid_page >= self.total_page:
                show_page = range(self.total_page - self.page_show_num +1, self.total_page + 1)
            else:
                show_page = range(self.current_page - mid_page, self.current_page + mid_page+1)
        return show_page

    #获取当前页,开始条数
    @property
    def start(self):
        return (self.current_page - 1) * 5

    #获取当前页结束条数
    @property
    def end(self):
        end_page_num=0
        cur_num=(self.current_page-1)*self.page_size
        if cur_num+self.page_size > self.total_num:
            end_page_num=self.total_num
        else:
            end_page_num=cur_num+self.page_size
        return end_page_num

    #获取上一页
    @property
    def pre_page(self):
        page_str=‘‘
        if self.current_page>1:
            page_str = ‘<a href="%s%s">上一页</a>‘%(self.base_url,self.current_page - 1)
        return page_str

    #获取下一页
    @property
    def next_page(self):
        page_str=‘‘
        if self.current_page < self.total_page:
            page_str = ‘<a href="%s%s">下一页</a>‘%(self.base_url,self.current_page + 1)
        return page_str

    #获取第一页
    @property
    def first_page(self):
        page_str=‘‘
        if self.total_page>1 and self.current_page!=1:
            page_str=‘<a href="%s1">首页</a>‘%self.base_url
        return page_str

    #获取尾页
    @property
    def last_page(self):
        page_str=‘‘
        if self.total_page>1 and self.current_page!=self.total_page:
            page_str = ‘<a href="%s%s">尾页</a>‘ % (self.base_url,self.total_page)
        return page_str

    #拼接html和javascript进行跳转页面
    @property
    def go_page(self):
        page_str=‘‘
        if self.total_page>1:
            inp="""<input type=‘text‘ /><a onclick="Jump(‘%s‘,this)">GO</a>"""%(self.base_url)
            script="""
                <script>
                    function Jump(baseUrl,ths){
                        var v=ths.previousElementSibling.value;
                        if(v.trim().length>0){
                            location.href=baseUrl+v;
                        }
                    }
                </script>
            """
            page_str=inp+script
        return page_str

    #返回模板页面所需要显示的html,需要在模板也进行还原, {% raw XXX %}
    @property
    def page_str(self):
        page_list=self.get_list()
        page_list_num=[]
        page_list_num.append(self.first_page)
        page_list_num.append(self.pre_page)
        for p in page_list:
            if self.current_page==p:
                temp="<a href=‘%s%s‘ class=‘cur‘>%s</a>"%(self.base_url,p,p)
            else:
                temp = "<a href=‘%s%s‘>%s</a>" % (self.base_url, p, p)
            page_list_num.append(temp)
        page_list_num.append(self.next_page)
        page_list_num.append(self.last_page)
        page_list_num.append(self.go_page)
        return ‘‘.join(page_list_num)

class IndexHandler(tornado.web.RequestHandler):
    #使用分页类
    def get(self,page):
        total_page = int(ceil(len(LIST_INFO) / 5))
        #获取页面分页信息
        Page=Pagination(page,len(LIST_INFO))
        #获取数据信息
        info = LIST_INFO[Page.start:Page.end]

        self.render(‘home/index.html‘, list_info=info, p=int(page), sp=Page.page_str)

    #原来分页方式,不使分页类,适用性不高
    def get2(self,page):
        try:
            page = int(page)
        except:
            page=1
        if page<1:
            page=1
        #每页显示5条,page是当前页
        total_page = int(ceil(len(LIST_INFO)/5))
        cur=(page-1)*5
        info=[]
        show_page=[]
        if cur+5 > len(LIST_INFO):
            info = LIST_INFO[cur:]
        else:
            info = LIST_INFO[cur:cur+5]
        if total_page <= 11:
            show_page=range(1,total_page+1)
        else:
            if page <= 5:
                show_page=range(1,12)
            elif page+5>=total_page:
                show_page=range(total_page-10,total_page+1)
            else:
                show_page=range(page-5,page+6)
        self.render(‘home/index.html‘,list_info=info,p=page,tp=total_page,sp=show_page)

    #接收post传递数据
    def post(self, page):
        user = self.get_argument(‘username‘)
        email = self.get_argument(‘email‘)
        temp = {‘username‘:user,‘email‘:email}
        LIST_INFO.append(temp)
        self.redirect(‘/index/‘+page)

前端模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
    .page a{
        margin-left: 5px;
        padding: 5px;
        background-color: lawngreen;
    }
    .page a:hover{
        background-color: rebeccapurple;
    }
    .page .cur{
        background-color: gold !important;
    }
</style>
<body>
    <h1>提交数据</h1>
    <form method="post" action="/index/{{p}}">
        <input name="username" type="text"/>
        <input name="email" type="text"/>
        <input type="submit" value="提交"/>
    </form>
    <h1>显示数据</h1>
    <table>
        <tr>
            <th>用户名</th>
            <th>邮箱</th>
        </tr>
        {% for line in list_info %}
            <tr>
                <td>{{line[‘username‘]}}</td>
                <td>{{line[‘email‘]}}</td>
            </tr>
        {% end %}
    </table>
    <div class="page">
        {% raw sp %}
    </div>
</body>
</html>

原文地址:https://www.cnblogs.com/ssyfj/p/8525070.html

时间: 2024-11-29 09:59:36

python全栈系列之---自定义分页类的相关文章

python全栈系列之---定义一个session类

首先:注意cookie中的get_cookie是返回字符串,而get_secure_cookie返回的是字节类型 #self.get_secure_cookie() #The decoded cookie value is returned as a byte string (unlike #`get_cookie`). md5加密获取的十六进制也是返回的字符串类型 import hashlib import time obj = hashlib.md5() obj.update(bytes(s

python全栈系列之---xss跨站脚本攻击和csrf(xsrf)攻击

xss跨站脚本攻击:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的. 例如:某些论坛允许用户自由发言,而不对用户的输入数据进行检测,直接显示在页面中. 若是用户输入了某些css样式代码,html表格代码,显示在页面后会改变页面的布局. 若是输入某些js代码,用于获取其他用户的文件,或者修改本地文件,也可以发送用户cookie等信息到自己的计算机中模拟用户登录 一般可以通过函数处理htmlspecial

python全栈系列之---cookie模拟登陆和模拟session原理

cookie模拟登陆: import tornado.web class IndexHandler(tornado.web.RequestHandler): def get(self): #self.write("Hello world") # 展示所有的cookie # print(self.cookies) # print(self.get_cookie('k1')) # self.set_cookie('k1','999')#还有 过期时间 适用路径 # self.render(

Python全栈之路系列之赋值与运算符

Python全栈之路系列之赋值与运算符 在继续下面的文章之前我们先来浏览一下Python为我们提供的几种运算符,定义两个变量,分别是a和b,a的值是10,b的值是20. 算术运算符 运算符 描述 实例 + 加,两个对象相加 a+b=30 - 减,两个对象相减,可能会得到负数 a-b=-10 * 乘,两数相称或是返回一个被重复若干次的字符串 a*b=200 / 除,两个对象相除 b/a=2 % 取膜,返回除法的余数 b%a=0 ** 幂,返回x的y次幂 a**b=10000000000000000

python全栈开发devops运维自动化方向初到高级在线课程分享

适用人群 面向想要devops方向发展的全栈python运维开发工程师 课程概述 课程范围:我们的课程由浅入深包含C01到C05五个等级:包含前后端知识,覆盖培养一个合格python全栈工程师所需要的所有技能:还有Ca系列附加课对开发规范和git使用方式提供帮助说明,并对一些新的知识点持续更新: 包含项目:一共4个项目(用户系统cmdbansible任务管理系统项目发布系统),并包含源码. 视频课程地址和详情介绍:http://study.163.com/course/introduction.

Python全栈开发【基础二】

Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 编码与进制转换 Python 运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.逻辑运算:  5.成员运算: 基本数据类型 1.数字 int(整型) 1 class int(object): 2 """ 3 int(x=0) -> integer 4 int(x, base=10) -&g

Python全栈考试-部分试题(精选)

Python全栈考试(一) Python全栈考试(一) 1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py   #必须在首行有 #!/usr/bin/env python3 指定执行语言 2.简述位.字节的关系 答:一个字节(byte)=8位(bit)  位为最小的单位 3.简述 ascii.unicode.utf-8.gbk 的关系 ascii:只能表示256个符号 unicode:万国码,各国都有 需要有2位

python全栈开发目录

python全栈开发目录 linux命令 初识python python基础数据类型 函数编程.set.深浅拷贝 内置函数 文件操作 装饰器 迭代器和生成器 常用模块 初识类和对象 类和对象(进阶) 反射 异常处理 socket.IO多路复用 线程.进程.协程 HTML CSS JavaScript DOM文档操作 jQuery实例 web框架本质 Tornado mysql基础 mysql进阶 ..... 基本算法 递归--二分法查找 冒泡排序 更多 线程池

Python全栈

Linux 常用命令 Python全栈开发之1.输入输出与流程控制 Python全栈开发之2.运算符与基本数据结构 Python之实现一个简易计算器 Python之socketserver源码分析 Python全栈开发之3.数据类型set补充.深浅拷贝与函数 Python全栈开发之4.内置函数.文件操作和递归 Python全栈开发之5.几种常见的排序算法以及collections模块提供的数据结构 Python全栈开发之6.正则表达式 Python全栈开发之7.模块和几种常见模块以及format