一、分页
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 | 不能为空 |
---|---|
是否是邮箱格式 | |
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