分页和cookie

juzixiong / 2023-05-07 / 原文

分页和cookie

分页

# 当数据量过多的时候,一页展示不完,就需要分页
参数:
	1. 当前页
	2. 总数据
    3. 每页数据
    4. 总页数
def index(request):
    book_obj = models.Book.objects.all()  # 实例化一个对象
    count = book_obj.count()  # 总数量
    per_page_num = 5  # 每页展示多少条数据
    current_page = request.GET.get('page', 1)  # 获取前端返回的值
    current_page = int(current_page)
    start = (current_page - 1) * per_page_num
    end = start + per_page_num
    page_count, yushu = divmod(count, per_page_num)  # 总页数
    if yushu:
        page_count += 1

    page_html = ''
    temp = current_page
    if current_page<4:  # 判断下限
        current_page = 4
    if current_page>(page_count-3):  # 判断上限
        current_page=(page_count-3)
    for i in range(current_page-3, current_page + 4):
        if i == temp:
            page_html += '<li class="active"><a href="?page=%s">%s</a></li>' % (i, i)
        else:
            page_html += '<li><a href="?page=%s">%s</a></li>' % (i, i)
    book_lis = book_obj[start:end]
    return render(request, 'index.html', locals())

分页类的使用

# 以后再实际项目中,会经常用到非django 的第三方工具,对于这种第三方工具,我们一般会在django中新建一个文件夹叫 utils,以后很多封装的代码都使用用面向对象的写法
from utils.mypage import Pagination
from django.conf import settings  # 推荐这样优先查找本项目下的settings,找不到去源码找
# from Django05 import settings  # 只能获取这个文件下的settings的数据
current_page = request.GET.get('page', 1)
book_obj = models.Book.objects.all()
count = book_obj.count()
per_page_num = settings.PER_PAGE_NUM
page_obj = Pagination(current_page, count, per_page_num, 7)
book_lis = book_obj[page_obj.start:page_obj.end]
page_html = page_obj.page_html()

cookie和session的简单介绍

介绍一些背景信息
"""
	1. 网站它是不用保存用户的信息,最早期的时候,网站都是一些静态网站
		eg:新闻网站  博客
	2. 随着技术发展,诞生了很多需要登录的网站
    	eg: 淘宝  京东  支付宝...
    	登录:解决了在网站中,网站可以识别出你是谁
    	
  	以登录为例,当用户第一次登录网站的时候,用户输入用户名和密码,如果不保存下来,拿用户就每次都需要登录,意味着每次都要输入用户名和密码、
  	
  	针对以上的问题,如何解决的嫩?
  	利用到了cookie,当用户第一次登录成功网站的时候,服务端告诉浏览器把用户名和密码都给用户的浏览器,然后,用户浏览器把用户名和密码保存在本地,之后,用户在每次访问网站的时候,会自动把之前保存的用户名和密码都传给服务端,服务端接收浏览器传过来的用户名和密码在进行验证.
  	
  	针对以上方案有没有问题? 肯定是有的,把用户名和密码保存在浏览器本地最大的问题就是不安全!!!
  	
  	如何优化一下上述不安全问题?
  	session的诞生, session是把数据保存在服务端的,但是,session会生成一个随机字符串,在服务端做随机字符串和用户信息的对应关系
  	就是把用户信息保存在数据表中了,它是如何保存的?
        随机字符串1:用户信息1
        随机字符串2:用户信息2
        随机字符串3:用户信息3
  	
  	session做的事情:
  		1. 生成一个随机字符串
  		2. 把随机字符串和用户信息的对应关系保存在数据表中
  		3. 把随机字符串返回给浏览器,让浏览器把随机字符串保存下来
  	之后,用户在访问网站的时候,会把随机字符串一块提交过来,服务端拿着随机字符串去数据表中查询,如果查到了,说明登录了,如果查不到,就说明还没有登录
  		
  		select * from t where key = ''
  	
  	背景信息:cookie在浏览器上是可以选择不保存的
  	面试题1:session是基于cookie工作的?对,为什么?
  	面试题2:如果浏览器把保存cookie的开关关掉了,说白了就是不能保存用户信息了,问:session一定不能用了?对于不对?不对,
  	
  	
  	session把数据保存在数据表里了,但是,当数据量特备大的时候,查询效率肯定会降低
  	
  	
  	token:就是一个算法
"""

1. cookie
	# 就是把数据保存在浏览器上的数据都可以称之为cookie
    cookie一般保存的形式是:k:v键值对
2. session
	# session把数据保存在服务端

关于cookie和session的面试题:
	1. cookie把数据保存在浏览器
    2. session把数据保存在服务端
    3. session保存的数据更加安全
3. token
4. jwt------------>三段式信息-------------》加密得到的

Cookie的操作

# 使用Django操作cookie
return HttpResponse
return redirect
return render


obj = HttpResponse
return obj

obj = redirect
return obj

obj = render
return obj

# 如果你想操作cookie,必须使用obj对象

1. 设置cookie
obj.set_cookie('key', 'value')
2. 获取cookie
print(request.COOKIES.get("key"))
3. 还可以给cookie设置一个过期时间
	max_age:
    expires:是IE浏览器
    # 都是用来设置过期时间的
4. path
5. 前端也可以获取cookie和session
localstorage
sessionstorage
6. 删除Cookie(退出功能,注销功能)
	res.delete_cookie