Django学习-cookie和seesion

HTTP的设计是无状态设计,即在两次不同的请求间,没有设计相关状态保持,换句话说,你无法保证这次请求是上一轮哪一次请求的后续,这给鉴权、安全等带来了问题和麻烦,总不能每次请求都要求用户输入帐号密码吧。

解决方法:

一、cookies

    cookies是服务器发送给浏览器的一串数据(头部信息的Set-Cookie),浏览器在每次访问服务器时,都会回送这串数据给服务器(头部的cookie)。

    服务器读取浏览器回送的cookies方法:

        view接收到的HttpRequest对象都会包含一个COOKIES属性,这个属性是一个类字典对象,可以通过它读取浏览器发送的cookies。

         例:reques.COOKIES['xxx_name']

    服务器设置发送给浏览器的cookies方法:

         因服务器view视图返回要求是HttpResponse对象,在设置cookies时,需要使用HttpResponse对象的set_cookies方法。

         例:response = HttpResponse("this is a test")

                response.set_cookie("text", "this is a example")

        在设置cookie时,可以附带其他参数来限制cookie的行为。如设定cookie失效时间、cookie允许传递的站点应用(靠path路径区分),允许读取cookie的站点,是否要求通过HTTPS回传cookie等。

    cookies的缺点:

        1.不可控。浏览器是否被允许接受cookies并保存cookies由用户决定,服务器无法保证所有访问的浏览器均设置了cookies保存。

             如果需要测试浏览器端是否支持cookies存取,可以在view视图中通过设置request.session.set_test_cookie()。并在下次浏览器访问的时候检查request.session.test_cookie_worked(),返回True or False。注意需要分开来做,基于cookie的工作方式。证实了浏览器支持cookie后,需要手动使用request.session.delete_test_cookie()来清除测试。

        2.安全性差1。黑客可以在网络中拦截并读取cookies(尤其是明文发送的HTTP),若是在cookies中存储了敏感数据如帐号密码等,容易泄漏敏感数据。同时,当它拦截了该cookies后,就可以使用该cookies伪装成用户来访问网站。

        3.安全性差2。部分浏览器端修改cookies内容非常容易,若是服务端通过cookies中设置status=1的方式置状态来表示已登录用户,那要绕过这个权限管理系统将是非常容易的事情

 

二、sessions

    sessions框架用来处理Cookie,它会抽象的接收和发送cookie,数据保存在服务器端,而客户端的cookie只有会话ID,而且是哈希后的会话ID,且会话也有助于避免用户浏览器端设置“不接受”cookie的行为。session框架只能基于cookie。

    启用sessions:

        编辑项目settiongs.py中MIDDLEWARE_CLASSES属性,确保已包含了

        ‘django.contrib.sessions.middleware.SessionMiddleware’,同时INSTALLED_APPS属性包含'django.contrib.sessions'。

        2.0版本Django中,也可以在MIDDLEWARE参数里设置,默认是开启的。

    使用Sessions:

        SessionMiddleware中间件启用后,每个传给视图view的HttpRequest对象都会有一个session属性,这个属性是一个类字典型对象,可以通过操作字典方式来处理session。

        例:request.session['xxx_name']  # 获取session中xxx_name的值。

               reuqest.session.items()  # 获取所有键值对

        注:若要在视图外使用Session,需要导入Session model。通过session的model模型对数据库进行操作,获取到对应的QuerySet对象,查询对应的数据。

                 例:

from django.contrib.sessions.models import Session
ss = Session.objects.get(pk='32字节哈希串')
ss.expire_date      # 输出对应的datetime.datetime类型数据

    模型内建了get_decoded()方法来读取实际的session数据。

ss.get_decoded()

    保存Session:

        默认模式下,Django只会在session发生变化时,才会存入数据库。可以通过更改settings.py设置中的SESSION_SAVE_EVERY_REQUEST的值来更改这一默认模式,设为True时,Django会在每次收到请求的时候保存Session,即使没有发生变化。

             注:Session的cookie只有在一开始创建以及数据修改的时候,才会发送给浏览器,但是如果SESSION_SAVE_EVERY_REQUEST设置为True,则服务器会在每次响应中都发送cookie给浏览器。其expires参数都会更新(失效时间)。

    Session的其他一些常用设置:

        1.浏览器关闭会话失效:更改SESSION_EXPIRE_AT_BROWSER_CLOSE = True  #一旦设置这个,则每次打开浏览器都将要求登录操作

        2.SESSION_COOKIE_AGE:会话有效保持时间(秒),若设置为持久会话(即上面的参数设为False),则在这个参数设置的时间内,用户将不需要重新登录。默认是60 * 60 * 24 * 7 * 2,即两周。

       3.SESSION_COOKIE_DOMAIN:允许使用会话cookie的站点,默认为None,仅使用于当前站点,或设置站点字符串允许跨站点使用。

       4.SESSION_COOKIE_SECURE:是否使用https传输,默认False不使用。

       相应设置均在/site-packages/django/conf/global_settings.py文件中,有相应说明。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值