Flask框架(四)--分页,form表单类,csrf

本文详细对比了Django和Flask在分页和表单处理方面的实现方式,包括自定义分页器、Flask-WTF表单插件的使用,以及CSRF保护的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、分页

django中使用封装好的分页器paginator进行分页,它为我们提供了很多封装好的方法。

flask中需要自己封装。

封装

pager.py

import math
class Pager():
    # 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.data_count = len(data)
        self.previous_page = 0
        self.next_page = 0
        self.page_number = math.ceil( self.data_count / self.page_size)
        self.page_range = list((x for x in range(1,self.page_number + 1)))

    def page_data(self,page):
        result = self.data[(page-1)*self.page_size:page*self.page_size]
        if page == 1:
            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

from models import User,LeaveList
# 批量增加数据
# def add_data():
#     for x in range(1,100):
#         leave = LeaveList()
#         leave.request_id = 2
#         leave.request_name = '老王'
#         leave.request_type = '事假'
#         leave.request_start = '2019-10-09'
#         leave.request_end = '2019-10-10'
#         leave.request_description = '假期happy'
#         leave.request_phone = '12345678910'
#         leave.request_status = 0
#         leave.save()

if __name__ == '__main__':
    # add_data()

    # while True:
    #     page = input('请输入页数>>>>>')
    #     params = LeaveList.query.all()
    #     pager = Pager(params,10)
    #     print(pager.page_data(int(page)))
    #     print('页面数据条数:',pager.page_size)
    #     print('下一页页码:',pager.next_page)
    #     print('上一页页码:',pager.previous_page)
    #     print('最大页数:',pager.page_number)
    #     print('页码范围:',pager.page_range)
    #     print('数据总条数:',pager.data_count)
    #     print('是否最后一页:',pager.is_end)
    #     print('是否第一页:',pager.is_start)
    pass

视图

@app.route('/leave_all_list/<int:page>/',methods=['get','post'])
@loginVaild
def leave_all_list(page):
    user = User.query.get(request.cookies.get('user_id'))
    leave = LeaveList.query.all()
    pager = Pager(leave,10)
    page_data = pager.page_data(page)
    print(pager.page_range)
    if pager.page_number > 5:
        start = page - 3
        end = page + 2
        if start < 0:
            start = 0
            end = 5
        if end > pager.page_number:
            start = pager.page_number-5
            end = pager.page_number
    else:
        start = 0
        end = pager.page_number
    page_range = pager.page_range[start:end]
    return render_template('leave_all_list.html',**locals())

模板

在这里插入图片描述
在这里插入图片描述

请假单撤销按钮

ajax

视图
from flask import jsonify
@app.route('/cancel/',methods=['get','post'])
@loginVaild
def cancel():
    id = request.form.get('id')
    leave = LeaveList.query.get(int(id))
    leave.delete()
    result = {'code':10000,'msg':'删除成功'}
    return jsonify(result)
模板

在这里插入图片描述

<script>
    $('#cancel').click(
        function(){
            var id = $(this).attr('cx_id');
            $.ajax(
                {
                    url:'/cancel/',
                    type:'post',
                    data:{'id':id},
                    success:function (data) {
                        console.log(data);
                        alert(data['msg']);
                        window.location.reload();
                    },
                    error:function (error) {
                        console.log(error);
                    }
                }
            )
        }
    )
  </script>

二、form表单

安装表单插件

pip install flask-wtf

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

教学任务发布

  • 任务名称
  • 任务描述
  • 任务时间
  • 任务发布人

form表单类

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

flask的form表单默认携带了csrf_token,但是进行post请求的时候,不进行csrf_token的校验。

form.py
在这里插入图片描述
修改form.py

import wtforms
from flask_wtf import FlaskForm
from wtforms import validators

class TaskForm(FlaskForm):
    name = wtforms.StringField(render_kw={
                                   "class":"form-control",
                                   "placeholder":"任务名"
                               })
    description = wtforms.TextField(render_kw={
                                   "class":"form-control",
                                   "placeholder":"任务描述"
                               })
    time = wtforms.DateField(render_kw={
                                   "class":"form-control",
                                   "placeholder":"任务时间"
                               })
    public = wtforms.StringField(render_kw={
                                   "class":"form-control",
                                   "placeholder":"任务发布人"
                               })

视图

from form import TaskForm
@app.route("/add_task/",methods=['get','post'])
def add_task():
    task = TaskForm()
    return render_template("add_task.html",**locals())

模板
在这里插入图片描述

结果
在这里插入图片描述

form表单前端校验

前端校验的规则

DataRequired不能为空
Email是否是邮箱格式
Equelto校验两个值是否相同,常用于验证两次输入密码是否相同
length长度 max min
NumberRange数字范围
AnyOf指定范围
NoneOf不在范围

需要在视图中看检验结果
在这里插入图片描述

视图
from form import TaskForm
@app.route("/add_task/",methods=['get','post'])
def add_task():
    task = TaskForm()
    error = {}
    if request.method == 'POST':
        if task.validate_on_submit():
            # 获取数据
            formdata = task.data
            # 建立模型,保存到数据库
        else:
            error = task.errors
    return render_template("add_task.html",**locals())
结果

在这里插入图片描述

自定义校验规则

在这里插入图片描述

安装

在这里插入图片描述

模板
{% extends 'base.html' %}
{% block title %}
    教学任务发布
{% endblock %}
{% block label %}
    教学任务发布
{% endblock %}
{% block content %}
    <form action="" method="post">
        {% for t in task %}
        <p>
            {{ t }}
        </p>
        {% endfor %}
        <input type="submit" class="btn btn-google btn-block" value="提交">
    </form>
    {%  for one in error.keys() %}
        {% for value in error[one] %}
            <p style="color: red;">{{ one }}{{ value }}</p>
        {% endfor %}
    {% endfor %}
{% endblock %}
结果

在这里插入图片描述

三、csrf

csrf_token会随form表单类生成,但不会校验。

开启csrf校验

在这里插入图片描述
在这里插入图片描述

这样post请求就失败了
在这里插入图片描述

前端使用

在这里插入图片描述

表单类应用模板内无需添加,它自带csrf_token
在这里插入图片描述

避免校验

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值