cookie & session

cookie & session

cookie

  • cookie 即具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息

cookie 的原理

  • 由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

Django中操作cookie

  • 获取cookie

def get_cookie(request):
    print(request.COOKIES)
    # 字典的取值
    name = request.COOKIES.get('name') # 推荐使用
    # name = request.COOKIES['name']
    print(name)     # 拿到jack
    return HttpResponse('ok')
  • 加盐的cookie
def salt_cookie(request):
    obj = HttpResponse('ok')
    # 加盐 set_signed_cookie 后面参数 salt 必须要传
    obj.set_signed_cookie('name','jack',salt='asd',max_age=None)
    return obj

# 加盐后的结果
# name=jack:1gPnyX:2f-3j3xnk_iJLidz2MlVFUa99JE

'''
参数:
default: 默认值
salt: 加盐
max_age: 后台控制超时时间
'''
  • 设置cookie

    • 在Httpresponse这个对象上写
def test_cookie(request):
    obj = HttpResponse('hh')
    obj.set_cookie('name', 'jack')
    return obj

  • 删除cookie
def logout(request):
    obj= redirect("/login/")
    obj.delete_cookie("name")  # 删除用户浏览器上之前设置的cookie值
    return obj
  • 用cookie实现登录后查看订单的校验
from django.shortcuts import render, HttpResponse, redirect


def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')

    if request.method == "POST":
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
        if name == 'jack' and pwd == '123':
            obj = HttpResponse('login successful')
            # 设置cookie
            obj.set_cookie('is_login', True)
            return obj
        else:
            return HttpResponse('fail')


def order(request):
    # 从发送过来的请求中拿到cookie
    is_login = request.COOKIES.get('is_login')
    if is_login:
        return HttpResponse('this is order html')
    else:
        return redirect('/login/')

对上述代码的简单优化,做成认证装饰器,并且登录后直接跳转到访问页面

from django.shortcuts import render, HttpResponse, redirect


def login_auth(func):
    def inner(request, *args, **kwargs):
        url = request.get_full_path()
        is_login = request.COOKIES.get('is_login')
        if is_login:
            return func(request, *args, **kwargs)
        else:
            return redirect('/login/?next={}'.format(url))

    return inner


def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')

    if request.method == "POST":
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
        if name == 'jack' and pwd == '123':
            # 从GET中拿到提交过来的next路径
            next = request.GET.get('next')
            if next:
                obj = redirect(next)
            else:
                obj = redirect('/index/')
            # 设置cookie
            obj.set_cookie('is_login', True)
            return obj
        else:
            return HttpResponse('fail')


@login_auth
def order(request):
    return HttpResponse('this is order html')
  • cookie的其他属性
max_age   超时时间,传一个秒的时间
expires   超时时间,传一个datatime对象
path='/'  可以设置路径,设置路径之后,path='/index/',只有访问index的时候,才会携带cookie过来
domain    设置域名下有效domain='map.baidu.com'
secure=False  (默认是false,设置成True浏览器将通过HTTPS来回传cookie)
httponly=True  只能https协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

session

解决cookie不安全的问题,,存在服务器上的键值对{'sdaf随机字符串':{name:lqz,pwd:123}},用session必须跟cookie连用

  • 设置 session
def set_session(request):
    # 写session,干了以下三件事(每个浏览器会生成一个随机字符串)
    # 随机字符串是跟浏览器相关的,数据是跟账号相关的
    '''
     1 生成随机字符串:dfasfasdfa
   2 取数据库存储
   3 写入cookie(set_cookie('sessionid','dfasfasdfa'))
    '''
    # 设置值
    request.session['name']='lqz'
    return HttpResponse('ok')

设置值时:如果设置多个,它会以字典的形式存储到 session 表中的 session_data 字段中

注意:在执行session之前要先进行数据库的迁移操作,即python manage.py makemigrations & python manage.py migrate

在执行完上面的代码之后再django_session表中会多出一行被加密过的数据

  •  取 session

正常流程,去cookie中取出随机字符串,然后到session的django_session表去查询,取出session_data的数据,解密成字典,然后取对应的值,如name

def get_session(request):
    name = request.session['name']
    print(name)     # 拿到jack
    return HttpResponse('ok')
  • session的一些属性
# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']


# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

# 会话session的key
request.session.session_key  # 取到随机字符串,浏览器带过来的cookie的值

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")

# 删除当前会话的所有Session数据
request.session.delete()

# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()
    # 这用于确保前面的会话数据不可以再次被用户的浏览器访问,即删数据库,又删浏览器的cookie
    # 例如,django.contrib.auth.logout() 函数中就会调用它。

# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效
    * 如果value是个datatime或timedelta,session就会在这个时间后失效
    * 如果value是0,用户关闭浏览器session就会失效
    * 如果value是None,session会依赖全局session失效策略
View Code

 

posted @ 2018-11-26 21:15  cnblogs用户  阅读(198)  评论(0编辑  收藏  举报