THU.Cookie 及 Session

THU.Cookie 及 Session

批量插入数据

 # for i in range(10000):
    #     models.Book.objects.create(title='%s本书' % i)
    # models.Book.objects.filter(id__gt=0).delete()

    # 批量添加
    book = []
    # for i in range(100000):
    #     book_obj = models.Book(title='%s' % i)
    #     book.append(book_obj)
    #
    # models.Book.objects.bulk_create(book)  # insert into values(),(),(),(),(),()
    res=models.Book.objects.count()
    print(res)

分页原理的推导过程

# 分页
1. 当前第几页
2. 每页展示多少条数据
3. start=20, end =10
4. 总数据
# 求出一共分多少页?
eg: 
    1. 总数据:100, 每页显示10条
    page = 100 / 10 = 10  # => 商:10, 余数:0 
    2. 总数据:101, 每页显示10# => 商:10, 余数:1 
    page = 100 / 10 + 1 = 11
    3. 总数据:99, 每页显示10# => 商:9, 余数:9 
    page = 99 / 10 + 1 = 10
    
    # 规律:
    	只要是余数不为0, 总页数=+1
         divmod(100, 10) # => (10, 0) 
    

# sql
select * from table limit 50, 10

分页类的使用

   from utils.mypage import Pagination
    book_count = models.Book.objects.count()

    current_page = request.GET.get('page', 1)

    obj = Pagination(current_page, book_count)

    page_html = obj.page_html()
    book_list = models.Book.objects.all()[obj.start:obj.end]

cookie和session的介绍

cookie

  • 服务端保存在客户端浏览器上的信息都可以称之为 cookie
  • 一般以 k: v 键值对的形式保存,可以有多个

session

  • 数据是保存在服务端的并且他的表现形式一般也是 k: v 键值对,

总结:

  • cookie 就是保存在客户端浏览器上的信息
  • session 就是保存在服务端上的信息数据
  • session 是基于 cookie 工作的(其实大部分的保存用户状态的操作都需要 cookie)
# cookie

http协议的四大特性:
	无状态:不能保存用户信息

# 解决不能保存用户信息的问题:
	cookie, session, token ,jwt   

# cookie的数据保存位置?
	在浏览器中保存
# cookie的应用场景:
	用户登录, 保存用户信息
    

补充

token
	- session 虽然数据是保存在服务端的,但是禁不住数据量大
  - 服务器不再保存数据
  - 登陆成功之后 将一段用户信息进行加密处理,将加密之后的结果拼接在信息后面,整体返回给浏览器保存,浏览器下次访问的时候带着该信息,服务端自动窃取前面一段信息再次使用自己的加密算法跟浏览器尾部的密文进行比对

Django操作cookie

- 虽然 cookie 是服务端告诉客户端浏览器需要保存内容,但是客户端浏览器可以选择拒绝保存

- 那么只要是需要记录用户状态的网站即使登录成功都无法使用

# 视图函数的返回值
return HttpResponse()
return render()
return redirect()

obj1 = HttpResponse()
obj2 = render()
obj3 = redirect()
# 如果想要操作 cookie,就必须利用 obj 对象

设置 cookie
	obj.set_cookie(key, value)

获取 cookie
	request.COOKIES.get(key)
  
设置超时时间(均以秒为单位)
	obj.set_cookie(key, value, max_age=x)
  obj.set_cookie(key, value, exprise=x)  # exprise 针对 IE浏览器

登录功能

1、登录验证装饰器
def login_property(func):
    def inner(request, *args, **kwargs):
        last_url = request.get_full_path()  # 获取用户上一次想要访问的 url
        if request.COOKIES.get('account'):
            return func(request, *args, **kwargs)
        else:
            return redirect('/model/login/?next=%s' % last_url)

    return inner


2、登录功能
def login(request):
    if request.method == 'POST':
      	
        # 获取用户输入数据
        account = request.POST.get('account')
        password = request.POST.get('password')
        
        # 校验账户、密码
        if account == 'Only' and password == '0310':
            
            # 获取用户上一次想要访问的 url
            last_url = request.GET.get('next')
            
            # 存在则返回上一次想要访问的 url
            if last_url:
                obj = redirect(last_url)
            
            # 不存在则返回主页
            else:
                obj = redirect('/model/')
            
            # 保存用户登录状态
            obj.set_cookie('account', 'Just_you', max_age=20000)
            return obj
    return render(request, 'login.html')
  
  
3、返回主页  
@login_property
def homepage(request):
    if request.COOKIES.get('account') == 'Just_you':
        return render(request, 'homepage.html')
    return redirect('/model/login/')
  

4、注销功能
@login_property
def get_out(request):
    obj = redirect('/model/login/')
    obj.delete_cookie('account')
    return obj

Django操作session

session 数据是保存在服务端的,给客户端返回的是一个随机字符串
	- sessionid: 随机字符串
    
在默认情况下操作 session 的时候需要 Django 默认的一张 Django_session 表
	- 数据库迁移命令
  
Django 默认 session 的过期时间是 14 天
  
设置 session(可以同时设置多个值)
	- request.session['key'] = values

  
def set_session(request):
    request.session['hobby'] = 'girl'
    """
    1.Django 内部自动随机生成一个字符串
    2.Django 内部自动将随机生成的字符串和对应的数据保存到 Django_session 表中
        2.1现在内存中产生操作数据的缓存
        2.2在响应结果 Django 中间件的时候才真正操作数据库
    3.将产生的字符串返回给客户端浏览器保存
    """
    request.session.set_expiry()
    """
    1、整数 					多少秒
    2、日期对象 		 	 到指定日期就失效
    3、0					    一旦当前浏览器窗口关闭立刻失效
    4、不写				   14 天,Django 内部全局 session 默认的失效时间
    """
    return HttpResponse('嘿嘿嘿')


获取 session(request.session 获取的是一个对象,里面可以包含多个值)
	- request.session.get('key')
  
  
def get_session(request):
    if request.session.get('hobby'):
        """
        1.自动从浏览器中获取 sessionid 对应的随机字符串
        2.拿着该字符传去 Django_session 表中查找对应数据
        3.如果比对上了, 则将对应的数字取出并以字典的形式封装到 request.session 中
          如果比对不上,则 request.session 返回的结果为 None
        """
        return HttpResponse('^_^')
    return HttpResponse('大爷,再来啊')

  
'''
Django_session 表中的数据条数取决于浏览器
同一个计算机(IP地址)同一浏览器只会有一条数据生效(主要是为了节省服务端资源)
更换浏览器即可增加数据条数
当 session 过期时可能会出现多条数据对应一个浏览器,内部会自动识别并清除过期的 session 数据,也可以手动清除
一条数据可以对应
'''


清除 session
request.session.delete()  # 只删除服务端,不删除客户端
request.session.flush()  # 浏览器和服务端都清空(推荐)
  • session 是保存在服务端的,但是 session 的保存位置可以有多种选择
    • MySQL
    • Redis
    • Memcache
    • 文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值