• Django笔记:Cookie和Session


    在Django中,cookie和session都是使用键值对的形式来进行存储和操作的,可以使用response_obj.set_cookie()response_obj.delete_cookie()request.COOKIES等方式来设置、删除和获取cookie信息,使用request.session中的方法来操作session数据。

    一、cookie操作

    cookie是以键值对的形式保存在响应对象中并返回给客户端的,所以操作cookie需要在HttpResponseBase对象或其子类对象中操作并返回给客户端。

    设置cookie
    使用HttpResponseBase对象或其子类对象的set_cookie方法进行设置,该方法的常用参数如下:

    • key:键值对的key
    • value:键值对的value
    • max_age:有效期(秒),默认是浏览器会话结束时到期(即关闭整个浏览器时到期)。
    • expires:设置具体的过期日期,可以是一个datetime对象或者符合日期时间格式的字符串。如果同时设置了max_ageexpires,那么将会采用expires
    • path:设置cookie的有效url路径,默认为域名下的根路径,即根路径下所有的路径都是有效的。
    • domain:设置cookie的有效域名,默认为主域名下都有效,如果只是想针对某个子域名设置cookie,则可以设置此参数。
    • secure:默认False,如果设置为True,则表示只能在https协议下才有效。
    • httponly:默认False,如果设置为True,则表示客户端不能通过JavaScript操作cookie。
    # 视图函数返回一个带有cookie信息的响应对象
    def index(request):
        response = HttpResponse('cookie page!')
        response.set_cookie('username', 'zhangsan', max_age=180)
        return response
    

    获取cookie
    直接通过request.COOKIES获取即可,这是一个字典对象,通过操作字典的方式进行操作即可。

    删除cookie
    直接使用HttpResponseBase对象或其子类对象的delete_cookie(key)方法删除对应key的信息即可。

    二、session操作

    Django中默认是把session数据保存在数据库中(使用migrate命令时会自动生成一个django_session表,这个表就是专门用来存储session数据的),客户端请求时,会将该session的sessionid加入cookie中返回给客户端,同样的,如果需要session中的数据,就会根据cookie中sessionid去数据库中获取对应的session数据。

    session常用操作
    直接使用request.session即可进行session操作,可以像操作字典一样去操作request.session。注意,在request.session上操作之后不需要再到响应对象上进行操作了,包括cookie的操作也是不需要我们去进行了,Django会自动将该session的sessionid添加到cookie中并返回给客户端的。
    request.session中常用的方法:

    • get:获取session中指定的值。
    • pop:删除session中指定的值。
    • keys:获取session中的所有key。
    • items:获取session中所有的键值对。
    • clear:清除当前用户的所有session数据。这个方法不会立即删除数据库中的数据,客户端也会保留对应的sessionid,只不过无法获取到对应的session数据而已。
    • flush:删除session,并且删除在客户端保存的sessionid。这个方法会同时删除数据库和客户端中对应session数据,所以这个方法通常在注销等功能上用的较多。
    • set_expiry(value):设置过期时间。如果value是0,则表示浏览器关闭时session过期;如果value是正整数,则表示多少秒后过期;如果是None,则表示使用全局配置的session过期时间,即settings.py中的SESSION_COOKIE_AGE配置项,默认为2周的时间。
    • clear_expired:清除数据库中过期的session数据。因为Django不会自动清理过期的session数据,所以需要我们手动的清除这些数据,除了使用这个方法外,还可以在终端使用命令python manage.py clearsessions来清除过期的session数据。
    # 在视图函数中获取session信息
    def session_test_view(request):
        # request.session['username'] = 'zhangsan'
        username = request.session.get('username')
        print(username)
        return HttpResponse('session page!')
    

    session的存储方案
    Django中默认是把session数据存储在数据库中的,但是Django也提供了其他的session存储方案,在settings.py中配置SESSION_ENGINE为以下对应项即可:

    • django.contrib.sessions.backends.db:默认存储方案,使用数据库进行存储。
    • django.contrib.sessions.backends.file:使用文件来存储。
    • django.contrib.sessions.backends.cache:使用缓存来存储。想要使用这个方案,需要在settings.py中配置CACHES,并且使用Memcached缓存系统,不能使用纯粹的内存来存储。
    • django.contrib.sessions.backends.cached_db:会将数据同时存储到缓存和数据库中,获取数据时会优先到缓存中获取数据,如果缓存发生意外,数据也不会丢失,还可以从数据库中找回来。
    • django.contrib.sessions.backends.signed_cookies:将session信息加密后存储到浏览器的cookie中。使用这个方案,需要注意下:建议配置SESSION_COOKIE_HTTPONLY=True,那么浏览器就不能通过JavaScript来操作session数据了;还需要设置SECRET_KEY,并防止其泄露;当然,cookie中总的数据大小不能超过4KB。
  • 相关阅读:
    图片保持比例居中显示
    登录后跳转到登录前的页面
    如何为网站添加百度统计功能
    项目更新到公网服务器的操作步骤
    jQuery Mobile中表单的使用体会
    手机端静态网页制作需要注意的几个问题
    bootstrap分页插件的使用
    Dell7040mt安装win7系统说明
    linux静态ip的设置
    eclipse项目有红叉的解决办法
  • 原文地址:https://www.cnblogs.com/guyuyun/p/13898191.html
Copyright © 2020-2023  润新知