Django中session和cookie简单的使用

一、简单的理解

session和cookie是request下的两个对象,操作他们的值就是在操作字典,设置他们的属性就是调用方法。

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。解决此问题,常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

在Django中要用session一定要先执行(创建表的过程):
python manage.py makemigrations
python manage.py migrate

在这里插入图片描述

二、session:

*session存储机制
(1)、当用户来访问服务端时,服务端生成一个随机字符串;
(2)、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对 加到 cookie里发送给用户;
(3)、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存用户信息;

所以服务器存储的session格式应该是:
{sessionid:{‘username’:xx,‘password’:yy}}
request.session[‘username’] = ‘xx’
默认生成了随机的sessionid,并且隐含了通过sessionID找到用户信息那一步;

1.、设置值(字典):

request.session['username'] = 'Genius淼'
request.session['password'] = 'genius123'

request.session.setdefault('username','password')#username 默认值为'password'

2、设置属性

request.session.set_expiry(value) -- 设置session过期时间,默认是两周。

value:
- 数字(单位:秒)
- datatime(具体日期)
- None(依据全局失效策略)
- timedelta(时间增量)
注意:request.session.set_expiry(timedelta(days=30))时要在setting中添加:SESSION_SERIALIZER='django.contrib.sessions.serializers.PickleSerializer'

3、查看

request.session.keys()  
request.session.values() 
request.session.items()	

4、获取

request.session["username"] 		 #  以字典形式读取,键不存在会报错
request.session.get("username")		 #  以get方法形式读取,键不存在会报错
request.session.get("username",None) #  加参,如果username不存在则读取到None
request.session.session_key		     # 用户session的随机字符串

5、删除

del request.session["username"]		# 以字典形式删除
request.session.delete("username")	# 以方法形式删除
request.session.delete('session_key') #删除所有session
request.session.clear()				# 删除所有session
request.session.clear_expired()		# 删除已失效session
在setting中配置session(转)

session存储位置:
数据库(默认) SESSION_ENGINE = ‘sdjango.contrib.sessions.backends.db’
缓存 SESSION_ENGINE = ‘django.contrib.sessions.backends.cache’
文件 SESSION_ENGINE = ‘django.contrib.sessions.backends.file’
缓存+数据库 SESSION_ENGINE=‘django.contrib.sessions.backends.cached_db’
加密cookie(相当于没有用session,又把敏感信息保存到客户端了) SESSION_ENGINE = ‘django.contrib.sessions.backends.signed_cookies’

#session配置文件
SESSION_ENGINE = ‘django.contrib.sessions.backends.db’ # 引擎(默认)

SESSION_FILE_PATH = 文件路径 # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()

SESSION_COOKIE_NAME = “sessionid” # 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 = 1209600 # Session的cookie失效日期(2周)(默认)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)

SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)


三、cookie:

在django中,cookie是在声明一个HttpResponse之后,通过set_cookie方法来设置的。它通过在响应头里Set-Cookie设置键值对来实现在浏览器客户端保存Cookie。

res = HttpResponse()		# 具体是什么响应要看自己的return

  • 设置值(字典):

     res.set_cookie('username','password')
     res.set_cookie('Genius淼','genius123')
    
  • 获取

      username = request.COOKIES.get('username')
    
  • 删除

      res.delete_cookie('username')
    
  • 设置属性
    查看HttpResponseBase类:

    def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
           				domain=None, secure=False, httponly=False):
                   	 ......
    

    可传参:
    key:Cookie的名称
    value:Cookie的值
    max_age:失效时间,单位-秒。默认是-1 ——>负数:关闭浏览器失效;0表示删除该cookie。
    expires:失效日期,同session的set_expiry
    path:该Cookie的使用路径,’/‘为允许所有。’/index/‘则只能在/index下可以访问,注意最后的 /
    domain:可以访问该cookie的域名,以 ‘.‘开头’,如’.baidu.com’
    secure:该Cookie是否仅被使用安全协议传输,默认是False。当使用https时,必须要secure设置为True
    httponly:限制在浏览器控制台获取键值对,但无法对抓包工具进行限制。

    举例:res.set_cookie(“age”, “10”,max_age=“10”,expires=“2019-01-31”,)

  • 加密
    设置值:res.set_signed_cookie(‘age’, ‘10’,salt=“I’m secript”)
    取值:request.get_signed_cookie(‘age’,salt=“I’m secript”)
    如同多加了一条暗号

session与cookie参考

猜你喜欢

转载自blog.csdn.net/GeniusXYT/article/details/103096307