Django基础之cookie和session

Django基础之cookie和session

简介:由于HTTP协议是无状态的,所以没有办法保持会话,基于这种情况,浏览器发展出了cookie技术,通过cookie就能够完成持续对话,大致过程就是类似一个字典的东西,从客户端浏览器访问服务的时候,带着这个字典,那么后端服务器就能够将身份认证的标识或者一些其他的信息,放到cookie里面,供客户端使用,并且以后客户端再来访问服务端就会一直带着这个cookie,后端就客户端的认证就可以从cookie里面的数据进行认证,从而完成保持会话的功能.

Ctrl+Shift+del 三个键来清除页面缓存和cookie,会经常用到

什么是cookie?

cookie是浏览器的技术,指的是一段小信息,它是服务器发送出来的存储在浏览器上的一组组键值对,在下次访问服务器是浏览器会带着这些键值对,以方便服务器提取有用信息.

cookie的工作原理

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

 

一.django中操作cookie

1.设置cookie

ret=HttpResponse(...)
ret=render(request,'...')

ret.set_cookie(键,True) #创建一个cookie
ret.set_signed_cookie(键,True,salt='加密盐',max_age='',..) #对设置的cookie进行加密处理,max
_age表示该cookie 存在的时间,到达这个时间之后这个cookie自动删除


    参数:
      key, 键
      value='', 值
      max_age=None, 超时时间
      expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
      path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
      domain=None, Cookie生效的域名
      secure=False, https传输
      httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

2.获取cookie

request.COOKIES['cookie的键']

request.COOKIES.get('cookie的键')

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

    参数:

       default: 默认值

       salt: 加密盐

       max_age: 后台控制过期时间

3.set_cookie方法源码:

class HttpResponseBase:

   def set_cookie(self, key,       键
             value='',           值
             max_age=None,   超长时间 ,有效事件,max_age=20意思是这个cookie20秒后就消失了,默认时长是2周,这个是以秒为单位的
                     cookie需要延续的时间(以秒为单位)
                     如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止。

             expires=None,   超长时间,值是一个datetime类型的时间日期对象,到这个日期就失效的意思,用的不多
                       expires默认None ,cookie失效的实际日期/时间。
                              

             path='/',      Cookie生效的路径,就是访问哪个路径可以得到cookie,'/'是所有路径都能获得cookie
                                  浏览器只会把cookie回传给带有该路径的页面,这样可以避免将
                                  cookie传给站点中的其他的应用。
                                  / 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
                  
                   domain=None,         Cookie生效的域名
                                               
                                     你可用这个参数来构造一个跨站cookie。
                                     如, domain=".example.com"
                                     所构造的cookie对下面这些站点都是可读的:
                                     www.example.com 、 www2.example.com
                        和an.other.sub.domain.example.com 。
                                     如果该参数设置为 None ,cookie只能由设置它的站点读取。

                   secure=False,       如果设置为 True ,浏览器将通过HTTPS来回传cookie。
                   httponly=False       只能http协议传输,无法被JavaScript获取
                                                (不是绝对,底层抓包可以获取到也可以被覆盖)
                ): pass

4.删除cookie

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

二.jquery中的cookie操作

1.添加一个cookie

$.cookie('the_cookie','the_value');

2.创建一个cookie,设置时间为7天

$.cookie('the_cookie','the_value',{expires:7});

3.创建一个cookie并设置cookie的有效路径

$.cookie('the_cookie','the_value',{expires:7,path:'/'});

在默认情况下,只有设置 cookie的网页才能读取该 cookie。如果想让一个页面读取另一个页面设置的cookie,必须设置cookie的路径。cookie的路径用于设置能够读取 cookie的顶级目录。将这个路径设置为网站的根目录,可以让所有网页都能互相读取 cookie (一般不要这样设置,防止出现冲突)。

4.读取cookie

$.cookie('the_cookie');

5.删除cookie

$.cookie('the_cookie',null);

6.可选参数

$.cookie('the_cookie','the_value',{expires:7, path:'/', domain:'jquery.com', secure:true }) 

参数:

expires:(Number|Date)有效期;设置一个整数时,单位是天;也可以设置一个日期对象作为Cookie的过期日期;

path:(String)创建该Cookie的页面路径; domain:(String)创建该Cookie的页面域名; secure:(Booblean)如果设为true,那么此Cookie的传输会要求一个安全协议,例如:HTTPS;

三.sessoin

django中session相关方法

注意:这都是django提供的方法,其他的框架就需要你自己关于cookie和session的方法了。

 

# 获取、设置、删除Session中数据
#取值
request.session['k1']
request.session.get('k1',None) #request.session这句是帮你从cookie里面将sessionid的值取出来,将django-session表里面的对应sessionid的值的那条记录中的session-data字段的数据给你拿出来(并解密),get方法就取出k1这个键对应的值

#设置值
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
#帮你生成随机字符串,帮你将这个随机字符串和用户数据(加密后)和过期时间保存到了django-session表里面,帮你将这个随机字符串以sessionid:随机字符串的形式添加到cookie里面返回给浏览器,这个sessionid名字是可以改的,以后再说
#但是注意一个事情,django-session这个表,你不能通过orm来直接控制,因为你的models.py里面没有这个对应关系

#删除值
del request.session['k1'] #django-session表里面同步删除


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


# 会话session的key
session_key = request.session.session_key 获取sessionid的值

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

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

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

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

 

1.简单介绍:

Sessoin是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。

拿我们下面的例子简单来说: 用户在访问服务器时,我们通过session执行这条命令'request.session['is_login']=True ',相当于执行了以下操作,

#1.生成一个随机字符串,sessionid:随机字符串

#2.加密一些用户的信息,保存到数据库中的django_session表中个 ​ #session_key session_data ​ #随机字符串 加密的用户信息

#3.将session:随机字符串放到cookie{}里面

之后该用户再翻身顾问该服务器的其他web服务时,其它web资源再从用户各自的session中 取出数据为用户服务。

2.cookie和session的合并使用:
#views视图部分

def login(request):
    if request.method=='GET':
        return render(request,'login.html')
​
    else:
        username=request.POST.get('username')
        password=request.POST.get('password')    #从前端获取用户输入的信息
if username=='景导' and  password=='666':
            request.session['is_login']=True 
                                #执行这一步之前要确认数据库中有django_session表,不然会报错,因为要在这个表中添加信息
                                #这一步相当于做了三件事
                                #1.生成一个随机字符串,sessionid:随机字符串
                                #2.加密一些用户的信息,保存到数据库中的django_session表中个
                                    #session_key    session_data
                                    #随机字符串        加密的用户信息
                                #3.设置cookie,将sessionid:随机字符串放到cookie{}里面
                                        #ret.set_cookie()
            return  redirect('home')
        
            # ret.set_cookie('is_login',True,max_age=5)
            # ret.set_cookie('is_login',True)
            # return ret
else:
            return redirect('login')
​
​
def login_auth(f):
    def inner(request):                     #做一个装饰器,执行每一步操作时,用来检验是否存在cookie
        if request.method == 'GET':            #如果不存在,则跳转到指定页面,
                                                #进行一些操作获得cookie之后才允许执行别的操作
            cookie_obj = request.session.get('is_login')
            print(cookie_obj, type(cookie_obj))
            if cookie_obj != True:
                return redirect('login')
​
            ret=f(request)
            return ret
    return inner
​
​
@login_auth
def home(request):
    return render(request, 'home.html')
​
​
​
@login_auth
def index(request):
​
    return render(request,'index.html')
​
​
​
​
def out(request):
​
    request.session.flush()
    return redirect('login')

 

 

 

posted @ 2019-08-14 20:01  socoolonly1  阅读(85)  评论(0编辑  收藏  举报