Django框架 COOKIE和SESSION

一.介绍
1.用途:

如果直接输入后台的URL也可以访问,这显然不合理
这里缺失的就是COOKIE和SESSION配合的验证

2.工作机制:

1.COOKIE不属于HTTP协议的范围:HTTP协议无状态,故引入COOKIE,起桥接作用

2.COOKIE的工作原理:由Server产生内容,Browser收到请求后以文本形式保存在本地
Browser再次访问时,会自动带上COOKIE,Server通过COOKIE的内容来判断状态

3.由于COOKIE最大支持4096B,以及COOKIE保存在Client,可能被拦截或窃取
因此需要1种新机制,需要支持更多字节,并保存在Server,有较高安全性,这就是SESSION
通过COOKIE识别不同用户,对应的在SESSION里保存私密信息及超过4096B的文本

4.每次使用浏览器访问登陆页面时,一旦通过认证,Server会返回一组随机唯一的String(如123abc),这就是Cookie
而Server也会存储用户当前的状态,如login=True,username=hahaha等用户信息到SESSION中
这种存储是字典形式的,字典唯一的key就是Cookie,即SessionID,值是用户状态信息构成的字典
如果在Server查看Session,会看到:{'123abc':{'login':true,'username:hahaha'}}

6.给每个Client的COOKIE分配1个唯一的ID,这样通过COOKIE,Server就知道是谁的请求
然后再根据不同COKCIE的ID,在Server上保存一段时间的私密资料,如账号密码

在这里插入图片描述
3.语法
(1)操作Cookie:

#获取Cookie值:
<request>.COOKIES["<key>"]
#设置Cookie值:
<response>.set_cookie("<cookie_key>","<cookie_value>",<key>=<value>)
  #参数说明:
    key:指定参数;可为expires/max_age/path/domain/secure;str
#使用JQuery操作Cookie:需要先引入JQuery,再引入jquery.cookie.js
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.cookie.js"></script>
$.cookie("<cookie_key>","<cookie_value>",{<key>:<value>});
  #参数说明:
    key:指定参数;可为expires/maxAge/path/domain/secure;str

(2)操作Session(Session默认保存15天):

#获取Session:
<request>.session["<key>"]
#设置Session:
<reqeust>.session["<key>"]="<value>"
#删除Session:实际是把session_data更新为其他值,并非立即删除
del <request>.session["<key>"]
#设置Session的有效时间:
<request>.session.set_expiry(<value>)
  #参数说明:
    value:指定有效时间
      如果>0,会在value秒后失效
      如果是datatime/timedelta,会在该时间后失效
      如果是0,会在关闭浏览器时失效
      如果是None,依赖全局session失效策略

二.实例

  • 目录结构:

在这里插入图片描述

  • 代码:
<!--login.html:登录页面-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link rel="stylesheet" href="http://830909.blog.51cto.com/static/plugins/bootstrap-3.3.5-dist/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <form action="login.html" method="post">
            <div class="form-group">
                <label class="sr-only">username</label>
                <input type="text" class="form-control" name="username" placeholder="用户名"/>
            </div>
            <div class="form-group">
                <label class="sr-only">Password</label>
                <input type="password" class="form-control" name="passwd" placeholder="密码"/>
            </div>
            <div class="form-group">
                <input class="btn btn-primary" type="submit" value="http://830909.blog.51cto.com/8311014/Submit">
            </div>
        </form>
</div>
<script type="application/Javascript" src="http://830909.blog.51cto.com/static/js/jquery-2.2.1.min.js"></script>
<script type="application/javascript" src="http://830909.blog.51cto.com/static/plugins/bootstrap-3.3.5-dist/js/bootstrap.min.js"></script>
</body>
</html>

<!--backend.html:后台页面-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>backend</title>
    <link rel="stylesheet" href="http://830909.blog.51cto.com/static/plugins/bootstrap-3.3.5-dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="http://830909.blog.51cto.com/static/css/commons.css">
</head>
<body>
<div class="container">
    <h2>cookie 内容是 {{ cookie_content }}</h2>
    <h2>session 内容是 {{ session_content }}</h2>
    <h2>登录用户名 :{{ username }}</h2>
    <a href="http://830909.blog.51cto.com/logout/">注销</a>
</div>
<script type="application/javascript" src="http://830909.blog.51cto.com/static/js/jquery-2.2.1.min.js"></script>
<script type="application/javascript" src="http://830909.blog.51cto.com/static/plugins/bootstrap-3.3.5-dist/js/bootstrap.min.js"></script>
</body>
</html>
#views.py:综合使用Cookie和Session
#/usr/bin/env python
#coding=utf-8
from django.shortcuts import render,redirect

def login(request):
    if request.method=="POST":
        username=request.POST['username']
        pwd=request.POST['passwd']
        #print(request.COOKIES)#打印请求的Cookie值
        if username=='abc' and pwd=='123':
            #设置session内部的字典内容
            request.session['is_login']='true'
            request.session['username']='abc'
            #登录成功就重定向到后台的URL
            return redirect('/backend/')
    #登录不成功或第一访问就停留在登录页面
    return render(request,'login.html')

def backend(request):
	#这里必须用读取字典的get()把is_login的value缺省设为False
	#当用户访问backend这个URL时,先尝试获取浏览器对应的session的is_login的值
	#如果对方登录成功的话,在login里就已经把is_login的值修改为了True,反之这个值就是False的
    is_login=request.session.get('is_login',False)
    #如果为真,就说明用户是正常登陆的
    if is_login:
        #获取字典的内容并传入页面文件
        cookie_content=request.COOKIES
        session_content=request.session
        username=request.session['username']
        #username=request.session.get("username")
        return render(request,'backend.html',
                      {'cookie_content':cookie_content,
			           'session_content':session_content,
			           'username':username
                      })
    else:
        #如果访问的时候没有携带正确的session,
        #就直接被重定向url回login页面
        return redirect('/login/')

def logout(request):
    #直接通过request.session['is_login']回去返回的时候
    #如果is_login对应的value值不存在会导致程序异常
    #所以需要做异常处理
    try:
        #删除is_login对应的value值
        del request.session['is_login']
    except KeyError:
        pass
    #点击注销之后,直接重定向回登录页面
    return redirect('/login/')
#views.py中:只使用Cookie
#/usr/bin/env python
#coding=utf-8
from django.shortcuts import render,redirect

def login(req):
    if req.method=="POST":
        name=req.POST.get("name")
        ped=req.POST.get("pwd")
        if name="John" and pwd="123":
            ret=redirect("/index")
            ret.set_cookie("username",name,max_age=10)
            #最大有效时间为10s,之后失效;为秒数
            #expire也为最大有效时间,但为时间字符串;默认为15天
            #ret.set_cookie("username",{"name":name})
            return ret
        return render(req,"login.html")

def index(req):
    username=req.COOKIES.get("username",None)#默认值为None
    if username=="John":
        return render(req,"index.html",locals())
    else:
        return redirect("/login")
#url.py中:
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login),
    url(r'^backend/', views.backend),
    url(r'^logout/', views.logout),
]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值