Django之cookie+session

前言

HTTP协议 是短链接、且状态的,因此在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态;
html

cook是来自服务端,保存在浏览器的键值对,主要应用于用户登陆;python

cookie如此重要!!那么如何在Django应用cookie呢?cookie又有什么缺陷呢?mysql

1、Django应用cookie

参数介绍

一、max_age=1 :cookie生效的时间,单位是秒redis

二、expires:具体过时日期  sql

三、path='/':指定那个url能够访问到cookie;‘/’是全部; path='/'数据库

四、 domain=None(None表明当前域名):指定那个域名以及它下面的二级域名(子域名)能够访问这个cookiedjango

五、secure=False:https安全相关json

 

六、httponly=False:限制只能经过http传输,JS没法在传输中获取和修改浏览器

 

设置cookie

1.普通缓存

obj.set_cookie("tile","zhanggen",expires=value,path='/' )

2.加盐

普通cookie是明文传输的,能够直接在客户端直接打开,因此须要加盐,解盐以后才能查看

obj.set_signed_cookie('k','v',salt="zhangge")

 

获取cookie

一、普通

request.COOKIES.get(‘k’)

二、加盐

cookies=request.get_signed_cookie('k',salt='zhanggen')

 

最后给每一个视图函数装饰cookie认证功能

from until import mysqlhelper
from django.shortcuts import HttpResponse,render,redirect
import json
import datetime
from datetime import timedelta

def cookie_auth(func):
    def weaper(request,*args,**kwargs):
        cookies = request.get_signed_cookie('k', salt='zhanggen')
        if cookies == 'v':
            return func(request)
        else:
            return HttpResponse('OK')
    return weaper

now = datetime.datetime.utcnow()
delta = timedelta(seconds=10)
def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    else:
        name = request.POST.get('N')
        pwd=request.POST.get('P')
        if name=="alex" and pwd=="123":
            obj=redirect("/modal")
            # obj.set_cookie("tile","zhanggen",max_age=1,)
            value=now+delta
            obj.set_cookie("tile","zhanggen",expires=value,path='/',domain=None,secure=False,httponly=False)
            obj.set_signed_cookie('k','v',salt="zhanggen",)
            return obj
        else:
            return render(request,'login.html')

def test(request):
    return render(request,'layout.html')













@cookie_auth
def modal(request):
        sql='''
          SELECT  teacher.id as tid,teacher.`name`as tname,class.title FROM day64.teacher LEFT JOIN teacher_class ON day64.teacher.id=day64.teacher_class.tid
          LEFT JOIN day64.class ON day64.teacher_class.cid=day64.class.id;
            '''
        teacher_list= mysqlhelper.get_list(sql,[])

        res={}
        for row in teacher_list:
            tid=row["tid"]
            if tid in res:
                res[tid]["titles"].append(row["title"])
            else:
                res[tid]={'tid':row["tid"],'tname':row["tname"],'titles':[row["title"],]}

        class_list=mysqlhelper.get_list("SELECT id ,title FROM day64.class" ,[])
        return render(request,'modal.html',{"list":res.values(),"class_list":class_list} )
View Code
1、cookies
    1、什么是cookies
        cookies是一种数据存储技术
        将一段文本保存在客户端(浏览器)的一种技术。并能够长时间的保存
    2、cookies的使用场合
        1、保存登陆信息
        2、保存用户的搜索关键词
    3、django 中使用 cookies
        1、设置cookies(保存数据到客户端)
            1、不使用模板
                resp = HttpResponse("给客户端的一句话")
                resp.set_cookie(key,value,expires)
                return resp


                key : cookie的名称
                value : 保存的cookie的值
                expires : 保存的时间,以 s 为单位


                ex:
                    resp.set_cookie('uname','zsf',60*60*24*365)
            2、使用模板
                resp = render(request,'xxx.html',locals())
                resp.set_cookie(key,value,expires)
                return resp
            3、重定向
                resp = HttpResponseRedirect('/login/')
                resp.set_cookie(key,value,expires)
                return resp
    
        2、获取cookies(从客户端获取数据)
            request.COOKIES
Django不一样响应方式设置cokie
from django.shortcuts import render,HttpResponse,redirect,HttpResponseRedirect
from tools.resis_handler import connect_obj

def login(request):
    resp = redirect('/list_display/')
    resp.set_cookie('K','zhanggen')
    return resp
def display(request):
    print(request.COOKIES['K'])
    return HttpResponse('OK')
redirect方法设置cokie

 

2、cookie+session

一、cookie引入session:

cookie看似解决了HTTP(短链接、无状态)的会话保持问题,但把所有用户数据保存在客户端,存在安全隐患,

因而cookie+session出现了!咱们能够 把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串),

基于以上缘由:cook+session组合就此做古了单单使用cookie作会话保持的方式;

二、cookie+session的工做流程:

(1)、当用户来访问服务端时,服务端生成一个随机字符串;

(2)、当用户登陆成功后 把 {sessionID :随机字符串} 组织成键值对 加到 cookie里发送给用户;

(3)、服务器以发送给客户端 cookie中的随机字符串作键,用户信息作值,保存用户信息;

 

三、保存在服务端session数据格式

{

 随机字符串                                        用户信息

傻狍子的随机字符串:        {id:1,nam:"alex",account:1000000000 },

二狗子的随机字符串:        {id:1,nam:"eric",account:10}

 

 

 

 

 注意:request.session['name']=‘alex’,request.session默认隐含了经过sessionID找到用户信息那一步;

因此如今设置的是用户信息的键(name)和用户信息的值(alex),删除也是如此!

四、最终得出结论了!!!

 

session的应用 要依赖于cookie:(session就是 cookie的变种)

(1)每次用户第一次访问服务端, 把用户的惟一字符串 session_id加到cookie里面,发送给客户端;

 

(2)服务器端保存 随机字符串(sessionID:{用户信息})服务端

 

 

(3)下次来经过 cookie中的sessionID(键)获取用户信息值(值)

session做用:

会话保持,记住用户的登陆状态(WEB网站,分布式架构)

做用(和cookie的区别)

避免了敏感信息保存在客户端,防止客户端修改cookie信息!

 

五、Django应用session

def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    else:
        name=request.POST.get('user')
        pwd=request.POST.get('pwd')
        # obj=models.Girl.objects.filter(username=name,passwprd=pwd).first()
        obj = models.Boy.objects.filter(username=name, passwprd=pwd).first()
        if obj:
            #一、生成随机字符串(sessionID)
            #二、经过cookie发送给客户端
            #三、服务端保存{zhanggen随机字符串:{'name':'zhanggen'.'email':'zhanggen@le.com'}}
            request.session['name']=obj.username #在Django 中一句话搞定
            request.session['email'] = 'zhanggen@le.com'
            return redirect('/index')
        else:
            return render(request,'login.html',{'msg':"用户名/密码错误"})

def index(request):
    #一、获取客户端的 sessionID
    #二、在服务端查找是否存在 这个sessionID
    #三、在服务端查看对应的key sessionID键的值中是否有name(有值就是登陆过了!!)
    v=request.session.get('name')
    print(v)
    if v:
        return render(request,'index.html',{'msg':v})
    else:return redirect('/login/')

 使用参数:

def index(request):
        # 获取、设置、删除Session中数据
        request.session['k1']
        request.session.get('k1',None) #这样取值的不报错,没有拿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的随机字符串
        request.session.session_key       

request.session.clear_expired()
   #sessionID在客户端,过时后自动失效;
  但session信息存储在数据库里,sessionID过时后怎么删除呢?
没法动态删过时的session,可执行这个方法!(数据库中不只存储了session 还有该session的过时时间,这个方法就是where数据库里时间过时的session删除掉)
   request.session.exists("session_key")

# 删除当前用户的全部Session数据
request.session.delete("session_key")

request.session.set_expiry(value) 设置session过时时间

* 若是value是个整数,session会在些秒数后失效。 *
若是value是个datatime或timedelta,session就会在这个时间后失效。
*

若是value是0,用户关闭浏览器session就会失效。 *
若是value是None,session会依赖全局session失效策略。

# 检查 用户session的随机字符串 在数据库中是否

 

session配置文件

#session配置文件

SESSION_ENGINE = 'django.contrib.sessions.backends.file'  # 引擎
SESSION_FILE_PATH = 文件路径  # 缓存文件路径,若是为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
session不只能够保存在数据库里,
  • 数据库(默认)
  • 缓存(memchache、redis)
  • 文件
  • 缓存+数据库
  • 加密cookie




SESSION_COOKIE_NAME="zhanggen" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH="/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 600000 # Session的cookie失效日期(2周) 默认1209600秒 SESSION_EXPIRE_AT_BROWSER_CLOSE =True # 是否关闭浏览器使得Session过时
SESSION_SAVE_EVERY_REQUEST = True
#若是你设置了session的过时时间 30分钟后,这个参数是False30分钟事后,session准时失效
#若是设置 True,在30分钟期间有请求服务端,就不会过时!(为何逛一夜淘宝,也不会登出,可是不浏览器不刷新了就会自动登出)

 

 session保存位置配置

缓存 redis memcache
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎


浏览器cook(至关于没有用session,又把敏感信息保存到客户端了)
 SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

 

 

六、session注意事项

(1)、每一个用户的保存在 服务端的sessionID保存在数据库里的 sessionID隔离不同的,不会形成用户间的信息混淆!(淫王一问,我答错了!)

(2)、若是A用户和B用户在同一个浏览器登陆,会!由于保存在浏览器的sessionID前后覆盖了!!

(3)、若是用户的cookie泄露了,别拿着你的cookie也是能够 访问服务端的,因此cookie必定要保存好。

 

 

博客连接

二龙湖浩哥:http://www.cnblogs.com/yuanchenqi/articles/7439088.html#3770465

相关文章
相关标签/搜索