关于COOKIE和SESSION,参考 http://www.cnblogs.com/zhaof/p/7211253.html
基于cookie做用户验证时:敏感信息不适合放在cookie中
session依赖cookie
session原理
cookie是保存在用户浏览器端的键值对
session是保存在服务器端的键值对
session在服务端中存在的数据格式为:
session = {
随机字符串1:{
用户1的相关信息
}
随机字符串2:{
用户2的相关信息
}
}
session客户端即客户端的浏览器的cookie中存的数据是当前用户对应的随机字符串
样例:基于session实现用户登录认证
views.py内容如下:
from django.shortcuts import render,redirect user_info = { 'jack':{'pwd':'jack123'}, 'tom':{'pwd':'tom123'}, } def login(request): # print(request.method) if request.method=="GET": return render(request,"login.html") if request.method =="POST": u = request.POST.get("username") p = request.POST.get("pwd") dic = user_info.get(u) # print(u,p) if not dic: return render(request,"login.html") if dic["pwd"] == p: # 1.生成随机字符串 # 2.写到用户浏览器cookie # 3.保存到session中 # 4.在随机字符串对应的字典中设置相关内容 # session中设置值 request.session['username'] = u request.session['is_login'] = True return redirect("/cmdb/index/") else: return render(request, "login.html") def index(request): # 1.获取当前用户的随机字符串 # 2.根据随机字符串获取对应信息 # session中获取值 if request.session.get('is_login'): return render(request,"index.html") else: return render (request,"login.html") def logout(request): request.session.clear() return redirect('/cmdb/login/')
login.html内容如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/cmdb/login/" method="POST"> <input type="text" name="username" placeholder="用户名"> <input type="password" name="pwd" placeholder="密码"> <input type="submit" value="提交"> </form> </body> </html>
index.html内容如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>欢迎登陆 {{ request.session.username }}</h1> <a href="/cmdb/logout/">注销</a> </body> </html>
session的工作过程
1、 生成随机字符串
2、 写到用户浏览器的cookie中
3、 保存到session中
4、 在随机字符串对应的字典中设置相关内容
而上述过程在Django中的体现为:
request.session["username"]=u
这里的username为通过request.POST.get("username")从前端html页面中获取到的用户名信息
注意:
在Django中要用session中一定要先执行:
python manage.py makemigrations
python manage.py migrate
当用户登录的时候的就会在数据库的django_session表中记录session信息
同样的通过request.session.get("username")也可以获取相应的值
在这个过程中:
1、 首先获取当前用户的随机字符串
2、 根据随机字符串获取对应的内容
session的操作
request.session["k1"] 如果不存在则会报错
request.session.get("k1"),如果不存在则会报错,为了防止出错可以request.session.get('k1',none)
request.session['k1'] = 123 设置session值
request.session.setdefault('k1',123) 存在则不设置
del request.session['k1'] 删除
request.session.clear() 删除
所有 键、值、键值对
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失效策略。
配置setting.py
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,默认修改之后才保存(默认)
Django中对于session的存储方式
Django中支持session,其中内部提供了5种类型的session供开发者使用:
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
1、如果是数据库,需要在settings.py中配置如下:
SESSION_ENGINE = 'django.contrib.sessions.backends.db' (引擎(默认))
2、如果是缓存session,需要在settings.py中配置如下:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'(引擎)
SESSION_CACHE_ALIAS= 'default' 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
1、 如果是文件session, 需要在settings.py中配置如下:
SESSION_ENGINE = 'django.contrib.sessions.backends.file' (引擎)
SESSION_FILE_PATH=None 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
2、 如果是缓存+数据库session,需要在settings.py中配置如下:
SESSION_ENGINE='django.contrib.sessions.backends.cached_db' (引擎)