Django_cookie与session的状态保持(第十一天)

状态保持
http协议是无状态的,下一次去访问一个页面时并不知道上一次对这个页面做了什么
一、Cookie
在这里插入图片描述
cookie是由服务器生成,存储在浏览器端的一小段文本信息。
1、cookie的特点
1)以键值对方式进行存储
2)通过浏览器访问一个网站时,会将浏览器存储的跟网站相关的所有cookie信息发送给该网站的服务器。request.COOKKIES
3)cookie是基于域名安全的
4)cookie是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期
可以设置cookie过期时间:

from datetime import date, datetime, timedelta
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
# /set_cookie
def set_cookie(request):
    '''设置cookie信息'''
    response = HttpResponse('设置cookie')
    # 设置一个cookie信息,名字为num,值为1
    # response.set_cookie('num', 1, max_age=14*24*3600)  # 设置过期时间为两>    周
    response.set_cookie('num', 1, expires=datetime.now()+timedelta(days=14))
    # 返回response
    return response
 
# /get_cookie
def get_cookie(request):
    '''获取cookie的信息'''
    # 取出cookie num的值
    num = request.COOKIES['num']
    return HttpResponse(num)

2、案例(记住用户名)
思路:
1)在login表单中设置checkbox记住用户名,设置id为remember,在视图中通过request.POST.get(‘remember’)时如果表单提交时没有勾选记住用户名,则返回值为None,如果勾选了,则返回值为on;
2)在登录校验函数中,判断用户名密码正确后,判断是否需要记住用户名,如果记住了,则将用户名添加到response里的cookie中,最后将重定向返回;
3)第二次访问login登录页面时,就会通过视图的login函数获取cookie中的username值填充自动填充到表单用户名里面。
为了获取username值,需要判断是否username存在request.COOKIES中,如果存在则赋值给局域变量username,如果不存在则赋值空字符串给局部变量username,最后返回参数到表单中获取。
视图views.py源码如下

from django.shortcuts import render, redirect
def login(request):
     '''显示登录页面'''
     # 获取cookie username
     if 'username' in request.COOKIES:
         # 获取记住的用户名
         username = request.COOKIES['username']
     else:
         username = ''
     return render(request, 'xm20200425/login.html', {'username':username})
def login_check(request):
     '''登录校验视图'''
     # request.POST 保存的是post方式提交的参数
     # request.GET 保存的是get方式提交的参数
     # 1.获取提交的用户名和密码
     username = request.POST.get('username')
     password = request.POST.get('password')
     remember = request.POST.get('remember')
     # print(username,':',password)
     # 2.进行登录的校验
     # 实际开发:根据用户名和密码查找数据库
     # 模拟:smart 123
     if username == 'smart' and password =='123':
         # 用户名密码正确,跳转到首页
         response = redirect('/index')
         # 判断是否需要记住用户名
         if remember == 'on':
             # 设置cookie username过期时间为1周
             response.set_cookie('username', username, max_age=7*24*3600)
         return response
     else:
         # 用户名或密码错误,跳转到登录页面
         return redirect('/login')

login.html源码如下

  <!DOCTYPE html>
  <html lang="en">
  <head>
      <meta charset="UTF-8">
      <title>登陆页面</title>
  </head>
  <body>
  POST:提交的参数在请求头,数据安全性要求比较高的时候使用
  GET:提交的参数在url中
  <form method="post" action="/login_check">
      用户名:<input type="text" name="username" value="{{ username }}"><br/>
      密码:<input type="password" name="password"><br/>
      <input type="checkbox" name="remember">记住用户名<br/>
      <input type="submit" value="登陆">
  </form>
  </body>
  </html>

二、session
在这里插入图片描述
session存储在服务器中。
1、session的特点
1)session是以键值对进行存储的
2)session依赖于cookie
3)session也是有过期时间的
4)session存的值是什么类型,获取得到的值就是什么类型
2、对象及方法
1)以键值对的格式写session

request.session['键'] =

2)根据键读取值

request.session.get('键', 默认值)

3)清除所有session,在存储数据库表中删除值部分

request.session.clear()

4)清除session数据,在存储数据库表中删除session的整条数据

request.session.flush()

5)删除session中的指定键及值,在存储中只删除某个键及对应的值

del request.session['键']

6)设置会话的超时时间,如果没有指定过期时间则两个星期后过期

request.session.set_expiry(value)
# 如果value是一个整数,会话的session_id_cookie将在value秒没有活动后过期
# 如果value为0,那么用户会话的session_id_cookie将在用户的浏览器关闭时过期
# 如果value为None,那么会话的session_id_cookie两周之后过期

7)查看session中是否存在对应的键名称,返回值为布尔类型

request.session.has_key('键')

session在视图views.py中的操作源码如下

from django.shortcuts import render, redirect
from datetime import date, datetime, timedelta
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse

def login(request):
    '''显示登录页面'''
    # 判断用户是否登录
    if request.session.has_key('islogin'):
        # 用户已登录,跳转到首页
        return redirect('/index')
    # 获取cookie username
    if 'username' in request.COOKIES:
        # 获取记住的用户名
        username = request.COOKIES['username']
    else:
        username = ''
    return render(request, 'xm20200425/login.html', {'username':username})

def login_check(request):
    '''登录校验视图'''
    # request.POST 保存的是post方式提交的参数
    # request.GET 保存的是get方式提交的参数
    # 1.获取提交的用户名和密码
    username = request.POST.get('username')
    password = request.POST.get('password')
    remember = request.POST.get('remember')
    # print(username,':',password)
    # 2.进行登录的校验
    # 实际开发:根据用户名和密码查找数据库
    # 模拟:smart 123
    if username == 'smart' and password =='123':
        # 用户名密码正确,跳转到首页
        response = redirect('/index')
        # 判断是否需要记住用户名
        if remember == 'on':
            # 设置cookie username过期时间为1周
            response.set_cookie('username', username, max_age=7*24*3600)

        # 记住用户登录状态
        # 只要session中有islogin,就认为用户已登录
        request.session['islogin'] = True
        return response
    else:
        # 用户名或密码错误,跳转到登录页面
        return redirect('/login')
# /set_session
def set_session(request):
    '''设置session'''
    request.session['username'] = 'smart'
    request.session['age'] = 18
    request.session.set_expiry(5)
    return HttpResponse('设置session')

# /get_session
def get_session(request):
    '''获取session'''
    username = request.session['username']
    age = request.session['age']
    return HttpResponse(username + ':' + str(age))

# /clear_session
def clear_session(request):
    '''清除session信息'''
    request.session.clear()
    return HttpResponse('清除成功')

三、cookie和session的应用场景
cookie:记住用户名,安全性要求不高。
session:涉及到安全性要求比较高的数据,如银行卡账户和密码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值