python flask分页的实现(页面显示固定页数的方法)+ sys模块的使用(添加路径)+ 表单插件 flask-wtf + form前端验证 + 后端验证(自定义校验)+ jQuery中一些用法

一、flask中的分页


1. flask中分页的介绍


flask不像Django中有封装好的方法Paginator;在Django中可以直接拿来使用,在flask中要自己封装分页器


2. 封装分页器


# Paginator(data,10)     将data数据进行分页,  每页10条
class Pager:
    """
    flask通过limit   offset 对数据进行分页,但在分页器中却不能这样使用
    User.query.offset(2).limit(10).all()  ## offset 和limit的用法,我们传进来的数据是一个列表,并不能这样使用

    切片
    提供的功能
    """
    #### params = User.query
    ###  data =  列表
    def __init__(self,data,page_size):
        """

        :param data:   数据
        :param page_size:     每页的条数
        """
        self.data = data   ### 数据
        self.page_size = page_size    ### 每页条数
        self.is_start = False
        self.is_end = False
        self.page_count = len(data)    ##  总条数
        self.previous_page = 0     ####上一页
        self.next_page = 0    ##### 下一页
        self.page_number = self.page_count / self.page_size  ### 总共的页数    len(data) / page_size
        if self.page_number == int(self.page_number):
            self.page_number = int(self.page_number)
        else:
            self.page_number = int(self.page_number) + 1
        self.page_range =( x for x in range(1,self.page_number + 1))  ## 迭代器   1 2 3 4 5 6 7 8 9 10

    def page_data(self,page):
        """
        page   offset   limit   每页10条
        1         0       10
        2        10       10
        切片      start     end
        1         0        10         (page-1)* 10
        2         10        20
        3         20        30
        :return:  返回分页的数据
        """
        # result = self.data.offset().limit().all()
        page_start = (page -1) * self.page_size### 切片开始的位置
        page_end = page * self.page_size    ## 切片结束的位置
        result = self.data[page_start:page_end]
        print (page)
        if page == 1:
            print ("--------------")
            self.is_start = True
        if page == self.page_number:
            self.is_end = True
        self.next_page = page + 1  ## 下一页
        self.previous_page = page - 1  ##上一页
        return result

3. 分页方法的使用


if __name__ == '__main__':
    while True:
        page = int(input(">>>>"))
        params = Leave.query.all()   ## 列表
        pager = Pager(params,10)
        result = pager.page_data(page)
        print (result)
        print(pager.page_size)     ### 每页的条数
        # print(pager.data)   ### 全部数据
        print(pager.page_number)   ### 最大页数
        print(list(pager.page_range))   ## 页数范围
        print(pager.page_count)   ## 数据总条数
        print(pager.is_end)       ### 是否是尾页
        print(pager.is_start)      ### 是否首页
        print(pager.next_page)     ### 下一页
        print(pager.previous_page)     ### 上一页

在这里插入图片描述


4. 视图页调用分页器进行分页


在这里插入图片描述


5. 模板中使用返回的数据


     <ul class="pagination" style="float: right;">
        {% if not pager.is_start %}
            <li class="paginate_button page-item previous">
              <a href="/leave_all_list/{{ pager.previous_page }}/" class="page-link">上一页</a>
              </li>
     {% endif %}

          {% for p in pager.page_range %}
              {% if p == page %}
            <li class="paginate_button page-item previous active">
              <a href="/leave_all_list/{{ p }}/" class="page-link">{{ p }}</a>
              </li>
              {% else %}
                  <li class="paginate_button page-item previous">
              <a href="/leave_all_list/{{ p }}/" class="page-link">{{ p }}</a>
              </li>

              {% endif %}
          {% endfor %}

          {% if not pager.is_end %}
            <li class="paginate_button page-item previous">
              <a href="/leave_all_list/{{ pager.next_page }}/" class="page-link">下一页</a>
              </li>
     {% endif %}

     </ul>

6. 在当前页面显示固定的页数的方法


在视图函数中先定义好page_range(可迭代的页数),再在模板中使用

current_page = page  # 获取当前页码
    start = current_page - 3  # 使遍历的起始页面固定在当前页面前面第三个4---->1
    if start < 1:  # 在起始页面小于1时,变0
        start = 0
    end = current_page + 2  # 终止页面加2 如4 ----> 5
    if end > paginator.page_number:  # 终止页面大于当前页面变为当前页面
        end = paginator.page_number
    if start == 0:  # 起始页面为0,终止页面加5
        end = 5
    if end == paginator.page_number:  # 终止页面为当前页面,起始页面加5
        start = paginator.page_number - 5
    if end == paginator.page_number - 1:  # 终止页面为当前页面前一个页面时起始页面减4
        start = paginator.page_number - 4

    page_range = list(paginator.page_range)[start:end]

模板中调用page_range
在这里插入图片描述
效果:
在这里插入图片描述


二、sys模块的使用(添加路径)


import sys
import os

sys.path.insert(0,os.path.dirname(os.path.abspath(os.path.dirname(__file__))))

在这里插入图片描述


三、撤销功能


  • 模板:
    在这里插入图片描述
{% block script %}
    <script>
    $(".chexiao").each(
        function () {
            $(this).click(
                function () {
                    var id = $(this).attr("cx_id");
                    $.ajax(
                        {
                            url:"/chexiao/",
                            type:"post",
                            data:{"id":id},
                            success:function (data) {
                                console.log(data);
                                alert(data["msg"]);
                                window.location.reload();  //  重新加载
                            },
                            error:function (error) {
                                console.log(error)
                            }
                        }
                    )
                }
            )

        }
    )

    </script>

前端中获取cx_id的值

var id = $(this).attr("cx_id");

前端中重新加载到当前页

 window.location.reload();  //  重新加载
  • 视图
    在这里插入图片描述

四、表单插件 flask-wtf


django中学过csrf,django中间件 中已经写好了,flask中csrf嵌在表单后端校验(form表单类),叫flask-wtf

我们需要下载安装 插件

pip install flask-wtf

表单校验方式:

  • 前端校验
    • 对页面上数据进行校验,校验的字符串的长度,类型,是否为空,字段约束
  • 后端校验
    • 校验用户是否存在,校验数据的(敏感字(admin))

1. form表单类前端校验


① 定义form模型


在这里插入图片描述


② 视图返回实例对象


导入类并实例化
在这里插入图片描述


③ 前端调用


{% extends "base.html" %}

{% block label %}
    任务发布
{% endblock %}
{% block content %}

    <p>
        {{ task.name.label }}:
        {{ task.name }}
    </p>
    <p>
    {{ task.description.label }}:
        {{ task.description }}
    </p>
    <p>
    {{ task.time.label }}:
        {{ task.time }}
    </p>
    <p>
    {{ task.public.label }}:
        {{ task.public }}
    </p>

{% endblock %}

④ 修改form前端样式


  • 修改form.py中字段在html中显示的样式
    在这里插入图片描述
  • 优化前端模板
    在这里插入图片描述
  • 修改后样式
    在这里插入图片描述
    flask的form表单默认携带了csrf_token,但是进行post请求的时候此时不进行csrf_token校验

⑤ form 表单常用的前端校验的规则


在这里插入图片描述


⑥ 在视图中看到检验结果需要添加


在这里插入图片描述

  • 前端校验的一些用法
  • 使用验证器需要导包
    from wtforms import validators
    
    设置的验证器属性在这里插入图片描述
    一些效果:在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2. form表单后端校验(自定义校验)


① 定义函数


  • 定义规则
  • 使用需要导包,抛出错误警告
    在这里插入图片描述
  • 如果数据中有任何已经定义好的敏感字都会抛出验证器警告

② 调用函数(安装)


在这里插入图片描述


③ 完善视图和模板


  • 视图
    在这里插入图片描述
  • 模板
    在这里插入图片描述

五、jQuery属性操作,加载页面


① jQuery属性操作之attr


  • 定义和用法:

    • attr() 方法设置或返回被选元素的属性值。

    • 根据该方法不同的参数,其工作方式也有所差异。

  • 前端中获取cx_id的值 (获取属性值)

    var id = $(this).attr("cx_id");
    
  • 改变图像的 width 属性(改变属性值)

    $("button").click(function(){
      $("img").attr("width","180");
    });
    

② 前端中重新加载页面

  • 前端中重新加载到当前页

     window.location.reload();  //  重新加载
    
  • 前端中加载到指定url

     window.location.href=url;
    

发布了107 篇原创文章 · 获赞 43 · 访问量 6160

猜你喜欢

转载自blog.csdn.net/langdei/article/details/102592944