一、session 和 cookies 区别
在知乎看到的一个解释
1,session 在服务器端,cookie 在客户端(浏览器)
2,session 默认被存在在服务器的一个文件里(不是内存)
3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4,session 可以放在 文件、数据库、或内存中都可以。
5,用户验证这种场合一般会用 session 因此,维持一个会话的核心就是客户端的唯一标识,即 session id
作者:冯特罗
链接:https://www.zhihu.com/question/19786827/answer/21643186
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
二、使用django中的session
- session在setting.py配置
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,并且默认是将Session数据存储在数据库中
配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
- 缓存配置
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
- 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
- 缓存+数据库Session
数据库用于做持久化,缓存用于提高效率
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
- 加密cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
常见的操作
# 获取、设置、删除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.clear()
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
通过知乎大佬的解答,我们大概有了思路
#生成随机字符串
#写到用户浏览器cookie中
#保存session在对应的字典中
当我们在django使用时,首先在models模块输入数据库创建命令
根据上面重点request.session["kye"]=value
,request.session["表示"]=True
代码如下:
ef login(request):
if request.method == "GET":
return render(request,"login.html")
elif request.method == "POST":
u = request.POST.get("user",None)
p = request.POST.get("pwd",None)
if u=="root" and p=="root" :
#设置session识别
request.session["user"] = u
#设置判断标识
request.session["is_login"] = True
#设置超时时间
request.session.set_expiry(10)
return redirect("/index/")
else:
return redirect("/login/")
其他页面判断session例:
def index(request):
#重点获取当前session识别字段
if request.session["is_login"]:
return render(request,"index.html",{"msg":request.session['user']})
else:
return render(request,"index.html",{"msg":"失效"})
用户注销知识点request.session.clear()
清除浏览器中的cookies:
def logout(request):
request.session.clear()
return redirect("/login/")