zoukankan      html  css  js  c++  java
  • python_Tornado_web_框架_分页

    如何实现web_框架_分页?

      -- 思考什么是xss跨站攻击?

        --别人把js代码提交到后台,然后从后台返回数据的时候,别人上传的js变成html中的代码,

          就会插入别人的代码,带来极大的信息泄露的风险,

          tornado后台本身就把前端语言只当作字符串处理 

           {% raw 数据 %}     # 把字符变成代码

        -- 为啥不利用一下?

          把分页的字符转成前端语言,不就在后端对分页字符处理下,前端显示不就解决了?

      -- 如何逻辑实现?

        -- 根据数据的长度,每页显示的数据,计算出显示的页数,有余数,总页数多1

        -- 通过for循环,把跳转的a标签编码以字符串的形式拼接进去,

          通过if判断是否为当前页面,当前页面多拼接一个class

        -- 规定一页显示10个跳转a标签,那就得对for循环的条件进行限制,

          start = 当前页面 - 5,end = 当前页面 + 5

           还需要对当前页面小于5或者总页面-10小于当前页面的极端值处理,进行动态处理

        -- 首页字符串必须拼接在最前面,尾页应该拼接中最后的位置,跳转窗口拼接在尾页的后面

        -- 任何的跳转请求,方式都为get方式

        -- 如何实现input窗口跳转?

          -- 通过from表单,获得提交的值,

            通过判断,有form提交,当前页面就变成from表单中数据

    如果把这些逻辑写成一个函数?

      -- 好像不行,写成一个类,然后通过调用方法就完美了

      -- 写类前,首先要思考,接收什么数据?输出什么数据?

      -- 在这个类中,需要输入:总共元素长度、获得的页码、form提交的数据,

            需要输出:开始页面数据、结束页面数据、最后拼接好的数据

      -- 获得开始页面数据、结束页面数据,规定好页面展现的数据

      -- 在manager.py文件中写入

    #!/usr/bin/python3
    
    import tornado.web
    import tornado.ioloop
    user_list = []
    for i in range(101):            # 生成101个数据
        data = {'username': 'yizhihua1-' + str(i), 'work': 'student-' + str(i)}
        user_list.append(data)
        
    class HandlePage(object):
        """定义分页功能模块"""
        def __init__(self, page, total_data, go_page):        # 把当前页传入进来,和取得的用户信息列表
    
            all_page, c = divmod(total_data, 5)     # 计算总的页数,每页显示5行数据
            if c > 0:
                all_page += 1
            self.all_page = all_page
    
            if go_page:                             # 如果有值获得跳转的值,没值相当于没有跳转
                page = go_page
            try:                                    # 处理页码
                page = int(page)
            except Exception as e:
                print(e)
                page = 1
            if page < 0:
                page = 1
            if page > all_page:
                page = all_page
            self.current_page = page                # 获得页码
    
    
            pass
    
    
        @property
        def start(self):
            return (self.current_page - 1)*5    # 获得起始位置
    
        @property                               # 属性方法
        def end(self):
            return self.current_page*5          # 获得结束位置
    
        def str_page(self, url_page):           # url_page定义分页前缀
            if self.current_page <= 5:          # 判断最前面的页码
                start_page = 1
                end_page = 11
            elif self.current_page >= self.all_page - 5:      # 判断最后的页码
                start_page = self.all_page - 9
                end_page = self.all_page + 1
            else:
                start_page = self.current_page - 5   # 当前页—5
                end_page = self.current_page + 5     # 当前页+5
    
            list_page = []
    
            # 首页
            if self.current_page == 1:
                first_page = '<a href="javascript:val(0);">首页</a>'
            else:
                first_page = '<a href="%s%s">首页</a>' % (url_page, 1)
            list_page.append(first_page)
    
            for p in range(start_page, end_page):   # 显示规定的页数
                if p == self.current_page:                       # 进行页码拼接
                    temp = '<a class="hehe" href="%s%s">%s</a>' % (url_page, p, p)  # 判断是否是当前页,给当前页增加一个样式
                else:
                    temp = '<a href="%s%s">%s</a>' % (url_page, p, p)
    
                list_page.append(temp)
    
            # 尾页
            if self.current_page == self.all_page:
                last_page = '<a href="javascript:val(0);">尾页</a>'
            else:
                last_page = '<a href="%s%s">尾页</a>' % (url_page, self.all_page)
            list_page.append(last_page)
    
            # go页面,通过form表单简单实现了页面跳转
            go_page = """
                        <form class="go_page" action="{}" method="get" >
                        <input type="text" name="go_page">
                        <input type="submit" value="Go">
                        </form>
            """.format(url_page)
            list_page.append(go_page)
    
            str_page = ''.join(list_page)       # 把列表变成字符串
            return str_page
    
    # 传入: page total_data  go_page
    # 输出:start  end str_page
    
    class Home(tornado.web.RequestHandler):
    
        def get(self, page):
            total_data = len(user_list)             # 计算数据的长度
            obj = HandlePage(page, total_data, self.get_argument('go_page', None))
            str_page = obj.str_page('/home/')
    
            self.render('home.html', user_list=user_list[obj.start:obj.end], str_page=str_page)     # 处理结果传入模板
                                    # user_list进行分片,让其一页显示多少数据
    
        def post(self, *args, **kwargs):
            username = self.get_argument('username')        # 提交数据处理
            work = self.get_argument('work')
            temp = {'username': username, 'work': work}
            user_list.append(temp)
            self.redirect('/home/')                         # 页面跳转
    
    setting ={
        'static_path': 'static',
        'template_path': 'template',                        # 全局静态文件和模版路径设置
    }
    
    URLS = [
        # (r'/login/(?p)', Ajax),
        (r'/home/*(?P<page>d*)', Home),                    # 路由
    ]
    
    Application = tornado.web.Application(                  # 让配置生效
        URLS, **setting,
    )
    
    if __name__ == '__main__':
        Application.listen(9999)                            # 启动监听
        tornado.ioloop.IOLoop.instance().start()            # 启动框架
    

      -- 在home.html文件中写入

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>主页</title>
        <style>
            .hehe{
                color: red;
            }
            a{
                margin: 3px;
                 30px;
                height: 20px;
                background: green;
            }
            .go_page{
                margin: 10px;
                 222px;
                height: 30px;
                background: green;
            }
        </style>
    </head>
    <body>
        <h1>输入数据</h1>
        <form action="/home/1" method="post">
            <p><input type="text" name="username"></p>
            <p><input type="text" name="work"></p>
            <p><input type="submit" value="提交数据"></p>
        </form>
            <h1>展现数据</h1>
                <table border="1px">
                    <thead>
                    <tr>
                        <th>用户名</th>
                        <th>工作</th>
                    </tr>
                    </thead>
    
                    <tbody>
                    {% for i in user_list %}
                    <tr>
    
                        <td>{{ i['username'] }}</td>
                        <td>{{ i['work'] }}</td>
    
                    </tr>
                        {% end %}
                    </tbody>
    
                </table>
                <div>
    
                   <p>页码</p>
                    <div class="a">{% raw str_page %}</div>
                </div>
    
    </body>
    </html>
    

      -- 启动manager.py,访问http://127.0.0.1:9999/home/ 就可以进入web页面

    上面的代码是有哪些问题?

      -- 上面只是简单实现了,但是数据的生成来源于自己手动生成,并没有通过数据库去取,

      -- 上面的逻辑代码整理并没有按照MTV的格式进行分类整理

      -- html的样式,有点不太美,都是可以自定义,并不怎么认真去定义样式

  • 相关阅读:
    C++ 数字、string 简便互转
    【C语言】递归函数DigitSum(n)
    UVALIVE 4287 Proving Equivalences (强连通分量+缩点)
    【linux驱动分析】misc设备驱动
    C++ auto 与 register、static keyword 浅析
    spring 计时器
    Spring注解配置定时任务<task:annotation-driven/>
    去除ckeditor上传图片预览中的英文字母
    编码规范
    git 手动操作
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/6697838.html
Copyright © 2011-2022 走看看