18 cookie与session

添加新博客 编辑本博客

yuan先生博客

一、cookie

  • cookie大小限制为4KB
  • 一个服务器最多在客户端浏览器上保存20个cookie
  • 一个浏览器最多能保存300个cookie

views中添加cookie一定要添加在相应体中,相应体可以是render和redirect或HTTPResponse,render和redirect都属于HTTPResponse对象

def login(request):
    if request.method=='POST':
        name=request.POST.get('name')
        pwd=request.POST.get('pwd')
        user= UserInfo.objects.filter(name=name,pwd=pwd).first()
        if user:
            responst=HttpResponse("登录成功!")
            responst.set_cookie("is_login",True)
            return responst
        else:
            pass
    else:
        return render(request,'login.html')

def index(request):
    #获取cookie
    cookie=request.COOKIES
    is_login=cookie.get('is_login')
    if is_login:
        return render(request,'index.html')
    else:
        return redirect('/login/')
View Code

设置cookie:response.set_cookit(key,val)

  • key
  • val
  • max_age=None,超时时间,以秒为单位,不设置直到浏览器关闭。IE浏览器不支持
  • expires=None,cookie失效的实际日期/时间,固定某个时刻失效,传入datetime测试
    date=datetime.datetime(year=2018,month=7,day=21,hour=4,second=10)
    responst.set_cookie("is_login",True,expires=date)
    View Code
  • path='/',cookie生效路径。浏览器只会回传带有该路径的页面,避免跨应用访问。/表示根路径,特使的:根路径的cookie可以被任何url的页面访问
  • domain=None,cookie生效的域名,可以用该参数构造跨站cookie。如设置domain='.example.com'对www.example.com,email.example.com都有效。不设置只有设置他的域名有效
  • secure=False,设置为true,浏览器将通过https来回传cookie
  • httponly=False,只能http协议传输,无法被JavaScript获取,非绝对

获取cookie:response.request.COOKIE.get(key)

删除cookie:response.delete_cookie(cookie_key,path="/",domain=name)

二、session

部分数据存放在服务器,给客户端的只是随机字符串。django自己维护一个django-session表

  1. 生成随机字符串
  2. 给浏览器返回cookie,sessionid=随机字符串
  3. 键值对存放到数据库

设置session,

在view中对登录进行验证,验证成功后设置session值

def login_session(request):
    if request.method=='POST':
        name=request.POST.get('name')
        pwd=request.POST.get('pwd')
        user= UserInfo.objects.filter(name=name,pwd=pwd).first()
        if user:
            """
            1、生成随机字符串
            2、给相应体设置cookie,response.set_cookie('sessionid','随机字符串')
            3、在django-session表中创建记录,session-key,session-data
            """
            request.session['is_login']=True
            request.session['username']=user.name
            return HttpResponse('登录成功!')
        else:
            pass
    else:
        return render(request,'login.html')
View Code

浏览器得到一个sessionid的cookie

django-session表中会存在session数据,django对数据做了序列化处理

获取session

def index_session(request):
    """
    1、从request.COOKIE.get('sessionid')获取到sessionid值
    2、从django-session中获取该sessionid对应的数据
    3、将对应数据反序列化之后返回
    """
    is_login=request.session['is_login']
    username=request.session['username']
    if is_login:
        return render(request,'index.html',{'username':username})
    else:
        return redirect('/login_session/')
View Code

 

更新session

一个浏览器针对一个服务器只能由一个session存在。重新登录,有数据则更新,无数据则增加

同一个浏览器重新用其他账号登录,将修改django-session表中session_data数据

删除session

不推荐用del方法来做注销,flush()

del request.session['session_name']

def logout_session(request):
    del request.session['is_login']
    del request.session['username']
    return redirect('/login_session/')
View Code

 

flush()实现注销功能

def logout_session(request):
    # del request.session['is_login']
    # del request.session['username']
    """
    1、通过sessionid过滤出改id
    2、在django-session表中删除该条记录
    3、将response中的sessionid的cookie也会删掉
    """
    request.session.flush()
    return redirect('/login_session/')
View Code

session其他配置,详见yuan博客

setting配置中将修改全局的配置

 总结:

  • response.set_cookie(key,val)
  • request.COOKIE.get(key)
  • request.session[key]=val
  • request.session[key]
  • request.session.flush()
posted @ 2018-07-22 11:46  丫丫625202  阅读(290)  评论(0编辑  收藏  举报