Django—Cookie and Session

时间:2023-03-09 08:44:11
Django—Cookie and Session

一、Cookie

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。

1. 应用

  • 服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。
  • Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。
  • 另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。

2. 获取Cookie

 #获取普通Cookie
request.COOKIES['key'] #获取签名Cookie
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数:
default: 默认值
salt: 加密盐
max_age: 后台控制过期时间

3. 设置Cookie

#先获取views函数的返回对象
rep = HttpResponse(...) 或 rep = render(request, ...) #设置普通Cookie,键值对
rep.set_cookie(key,value,...) #设置签名Cookie
rep.set_signed_cookie(key,value,salt='加密盐',...) 参数:
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获取(不是绝对,底层抓包可以获取到也可以被覆盖)

4. 操作Cookie

由于Cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。

<script src='/static/js/jquery.cookie.js'></script>
$.cookie("list_pager_num", 30,{ path: '/' });

5. 应用Cookie进行用户登陆状态保持

 from django.shortcuts import render, HttpResponse, redirect

 #Cookie登陆验证装饰器
def auth(func):
def wrapper(request):
tk = request.COOKIES.get('login_keys') # 根据键获取cookies
if not tk: # 若cookie不存在,跳转至登陆页面
return redirect('/login.html/')
else:
return func(request) # 否则,执行当前url
return wrapper #登陆验证,登陆成功则返回客户端Cookie
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
user_name = request.POST.get('user') # 获取用户名
user_pwd = request.POST.get('pwd') # 获取用户密码
if user_name == 'jack' and user_pwd == '': # 若用户名和密码匹配
obj_cookie = HttpResponse('登陆成功!')
obj_cookie.set_cookie('login_keys', '', max_age=3600) # 设置Cookie,有效期1小时
return obj_cookie
else:
return HttpResponse('密码错误') @auth
def index(request):
return HttpResponse('welcome to index')

基于Cookie的登陆验证

二、Session

不同于Cookie,Session是保存在服务器端的会话数据。

在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。

Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

  • 数据库(默认)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

1. 数据库Session

 Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

 a. 配置 settings.py

     SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

     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,默认修改之后才保存(默认) b. 使用 def index(request):
# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',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 # 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key") # 删除当前用户的所有Session数据
request.session.delete("session_key") request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

数据库Session

2. 缓存Session

 a. 配置 settings.py

     SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 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,默认修改之后才保存 b. 使用 同上

缓存Session

3. 文件Session

 a. 配置 settings.py

     SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T 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,默认修改之后才保存 b. 使用 同上

文件Session

4. 缓存+数据库Session

 数据库用于做持久化,缓存用于提高效率

 a. 配置 settings.py

     SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

 b. 使用

     同上

缓存提高效率,数据库保持持久

5. 加密cookie Session

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

b. 使用

    同上

6. 应用Session进行用户登陆状态保持

 from django.shortcuts import render, HttpResponse, redirect

 #Session登陆验证装饰器
def auth(func):
def wrapper(request):
tk = request.session.get('user') # 根据键获取session
if not tk: # 若session不存在,跳转至登陆页面
return redirect('/login.html/')
else:
return func(request) # 否则,执行当前url
return wrapper #登陆验证
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
user_name = request.POST.get('user') # 获取用户名
user_pwd = request.POST.get('pwd') # 获取用户密码
if user_name == 'jack' and user_pwd == '': # 若用户名和密码匹配
request.session['user'] = user_name # 写当前用户至session中
request.session.set_expiry(3600) # 设置session,有效期1小时
return redirect('/index.html/')
else:
return HttpResponse('密码错误') @auth
def index(request):
return HttpResponse('welcome to index')

基于Session的登陆状态验证

参考资料:

1. http://www.cnblogs.com/wupeiqi/articles/5246483.html

2. http://baike.baidu.com/item/Cookies/187064

3. http://baike.baidu.com/item/session/479100