django进阶之cookie和session的使用示例
cookies :是浏览器为 web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它收到服务器回发送过来的cookies。它保存在浏览器下的某个文件夹下。
session:django的session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,django默认会把session存入到数据库中。
session依赖于cookie,如果浏览器不能保存cookies那么session就失效了。因为它需要浏览器的cookie值(sessionid)去session里做对比。session就是用来在服务器端保存用户的会话状态。
cookie
1、获取cookie:
request.cookies[key] request.cookies.get(key) # 普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看 request.get_signed_cookie(key, default=raise_error, salt='', max_age=none)
参数:
- default: 默认值
- salt: 加密盐
- max_age: 后台控制过期时间
2、设置cookie:
rep = httpresponse(...) 或 rep = render(request, ...) 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 true只能http协议传输,无法被javascript获取(不是绝对,底层抓包可以获取到也可以被覆盖),防止xss攻击
由于cookie保存在客户端的电脑上,所以,javascript和jquery也可以操作cookie。
<script src='/static/js/jquery.cookie.js'></script> $.cookie("list_pager_num", 30,{ path: '/' });
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")
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. 使用
同上
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. 使用
同上
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. 使用
同上
示例:
from django.shortcuts import render,redirect # create your views here. import datetime def login(request): print("cookies",request.cookies) #打印cookies 一个字典,里面多个键值对 print("session",request.session) #session为服务器对应客户信息的键 if request.method=="post": name=request.post.get("user") pwd=request.post.get("pwd") if name=="yuan" and pwd=="123": # ret=redirect("/index/") # 给对象ret设置cookie 安全性较差 ,设定有效时间max_age,expires, # ret.set_cookie("username",{"11":"22"},max_age=10,expires=datetime.datetime.utcnow()+datetime.timedelta(days=3)) # return ret # cookie session一起使用 # session 以字典存放在服务器端,发给客户端的是数据对应的键, request.session["is_login"]=true # 在session中增加键值对 request.session["user"]=name return redirect("/index/") return render(request,"login.html") def index(request): if request.cookies.get("username",none): # 取不到设置默认值为none name = request.cookies.get("username",none) return render(request, "index.html", locals()) # session验证 存在数据库中,所以要先makemigrations生成数据库 if request.session.get("is_login",none): name=request.session.get("user",none) return render(request,"index.html",locals()) else: return redirect("/login/") ##session获取 request.session.get("user",none) # 设置 request.session["user"]=name # 删除 del request.session.get("user")
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。