Django之cookie 和 session

一、

1、cookie的由来!!!

    由于HTTP协议是无状态的,既每一次的请求都是独立的,他不会因为你之前来过,就记住你,所以每次浏览器去访问服务器的时候,都是一个全新的过程,之前的数据也不会保留,所以为了解决这个问题,cookie诞生了。

2、什么是cookie?

    Cookie具体指的是一段小信息,他是服务器发送出来存储在浏览器一组键值对,下次访问浏览器时会自动携带这些键值对,以便服务器提取信息。简单来说就是,Cookie会在你访问服务器时给你一个标记,下一次你再来访问只要携带这个标记,就能够访问了。所以他只认标记,不认用户。用的最普遍的就是做登录系统。

3、Cookie的工作原理。

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

4、查看cookie

    Name 和 Value就是键值对

二、Djangoz中操作Cookie

  1、获取cookie   

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

  参数:

    default:默认值

    salt:加密盐

    max_age:生命周期

  2、设置cookie

ret = render (request,'html文件')
ret.set_cookie('key','value')
return ret

    通过set_cookie,这样就对ret 设置了cookie。

   参数:

      key:键

      value:值

      max_age=None,超时时间

      expires = None,超时时间,用于IE浏览器的

      path='/':Cookie生效的路径,/表示根路径,他比较特殊。根路径的cookie可以被任何url页面访问。

      domain = None,cookie生效的域名

      secure= False:https传输

      httponly = False:只能http协议传输,无法被JavaScript获取。(不是绝对的,底层抓包可以获取到,也可以被覆盖)

  3、删除cookie

def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("key")  # 删除用户浏览器上之前设置的cookie
    return rep

  4、Cookie版登录校验的示例

from django.shortcuts import render, redirect, HttpResponse

# 这是一个装饰器,封装了一个匹配cookie的功能
def login_required(fn):
    def inner(request, *args, **kwargs):
        if not request.COOKIES.get('is_login') == '1':          # 获取cookie的键'is_login',判断它的值是不是1,如果不是就获通过path_info获取到域名之后的路径next
            next = request.path_info                            # cookie匹配不上,就跳转到登录界面,不过这个登录界面拼接了路径。/login/?next={}'.format(next),
                                                                # 拼接的后缀就是为了能够确保,从哪个页面失败人后进入的登录界面,登陆成功后跳回对应的页面
           return redirect('/login/?next={}'.format(next))                                                                
        ret = fn(request, *args, **kwargs)                        # 如果匹配成功,就跳转到被装饰得页面。

        return ret

    return inner

# 这是一个登录函数
def login(request):
    if request.method == 'POST':                    # 判断请求方法,是POST方法,执行下面的操作
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'alex' and pwd == 'alexdsb':        # 如果用户名和密码匹配成功了
            next = request.GET.get('next')            # 通过GET方法,获取next。

            if next:                                # 如果next有值,说明不是直接进的登录界面,而是访问其他路径,没有成功,通过装饰器拼接了next跳转过来的
                ret = redirect(next)                # next有值,就跳到next这个路径下
            else:                                    # 如果next没有值,说明是直接进入的登录界面,登陆成功后,直接跳转到'/index/'界面
                ret = redirect('/index/')            

            ret.set_cookie('is_login', '1', max_age=5)        # 设置cookie值cookie('键','值','最大死亡时间')
            return ret                                

    return render(request, 'login.html')


@login_required                                        
def home(request):                                    # 被装饰器装饰的函数,
    return HttpResponse('这是home页面')


@login_required
def index(request):
    return render(request, 'index.html')

# 注销函数
def logout(request):
    ret = redirect('/login/')

    ret.delete_cookie('is_login')                    # 删除cookie之后,跳转回登录页面

    return ret

三、Session

  1、Session的由来

    由于Cookie是存在浏览器上的,所以很不安全,随时可能被拦截和窃取,同时Cookie最大支持4096个字节,多了就没法存储了。这时,为了解决这个问题,提高cookie的安全性,有了Session。它能够支持更多的字节,并且把保存在服务器上,有较高的安全性。  

     由于HTTP是无状态的,所以服务器也不知道是谁再访问,所以就需要Cookie做桥接。给每个客户端的Cookie分配一个唯一的ID,这样用户在访问时,通过Cookie,服务器就知道来的认识谁。

   2、Django中Session的用法

    1、

# 获取、设置、删除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

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

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

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

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

  3、Session流程解析

  3、Session版登录验证

from functools import wraps


def check_login(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        next_url = request.get_full_path()
        if request.session.get("user"):
            return func(request, *args, **kwargs)
        else:
            return redirect("/login/?next={}".format(next_url))
    return inner


def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")

        if user == "alex" and pwd == "alex1234":
            # 设置session
            request.session["user"] = user
            # 获取跳到登陆页面之前的URL
            next_url = request.GET.get("next")
            # 如果有,就跳转回登陆之前的URL
            if next_url:
                return redirect(next_url)
            # 否则默认跳转到index页面
            else:
                return redirect("/index/")
    return render(request, "login.html")


@check_login
def logout(request):
    # 删除所有当前请求相关的session
    request.session.delete()
    return redirect("/login/")


@check_login
def index(request):
    current_user = request.session.get("user", None)
    return render(request, "index.html", {"user": current_user})

Session版登录验证
Session 版登录验证
原文地址:https://www.cnblogs.com/wf123/p/9783600.html