Django——会话.Cookie&Session
一、Cookie
会话指的是浏览器与web服务器之间的通信。HTTP协议是无状态协议。web服务器无法知道用户上一次会话数据,用来维护用户在访问网站过程中的状态 , 会话控制使用 Cookie 和 Session 一起实现。
通常把 Session 称为会话对象 , web服务器会给每一个用户创建一个 Session 对象 ,Session 对象在服务器端保存用户数据。Cookie 用于浏览器端保存用户数据。
Cookie 原理:当客户端访问服务端的时候,服务器会生成一份 Cookie 数据传输给浏览器,浏览器会自动把这份 Cookie 数据保存起来。之后浏览器在每一次请求访问的时候都回自动的携带这个 Cookie 数据。
Cookie保存是文本数据,以键值对的方式保存信息
def cookie_set(request): # 设置 Cookie 数据,因为 Cookie 要响应给浏览器 # 所以设置 Cookie 数据要使用 HttpResponse 对象或者其子类对象 # Cookie 数据在浏览器中保存的时间默认为 2 周 response = HttpResponse('设置 Cookie 数据') # set_cookie(key , value) , 设置 Cookie 的数据不能是中文 # max_age 设置过期时间, 单位:秒 # expires 以时间对象为单位设置过期时间 , datetime.timedelta() response.set_cookie('name','ac' , max_age=30) # datetime.datetime.now()+datetime.timedelta(days=2) 设置两天后过期 response.set_cookie('age','27' , expires=datetime.datetime.now()+datetime.timedelta(days=2)) return response def cookie_get(request): print(request.COOKIES) print(request.COOKIES.get('name')) return HttpResponse('获取 Cookie 数据') def cookie_del(request): # 删除 Cookie 数据需要通过使用 HttpResponse 对象或者其子类对象 response = HttpResponse('设置 Cookie 数据') # delete_cookie 删除 Cookie 数据 response.delete_cookie('age') return response
验证登录
def index(request): return render(request , 'index.html') def login(request): if request.method == 'GET': return render(request , 'login.html') name =request.POST.get('username') password =request.POST.get('password') if not all([name , password]): return render(request , 'login.html',{'error':'用户名或者密码错误'}) # 获取请求中的重定向 url 的参数 url = request.GET.get('redirect_url') # 判断是否有携带这个重定向的 url 参数 # 有,登录成功之后重定向到参数指定的 url 中 # 没有 , 默认响应首页 if url: response = redirect(url) else: response = redirect('/index/') response.set_cookie('cookie_data' , name) return response def cart(request): # 获取浏览器请求中的 Cookie 数据 res = request.COOKIES.get('cookie_data') # 判断是否有携带制定的键值对数据 if res: return HttpResponse('购物车页面') else: # 浏览器没有这份数据,需要进行登录 url = request.path return redirect(f'/login/?redirect_url={url}')
def wap(func): def inner(request , *args , **kwargs): # 获取浏览器请求中的 Cookie 数据 res = request.COOKIES.get('cookie_data') # 判断是否有携带制定的键值对数据 if res: # 返回对应的视图函数 return func(request) else: # 浏览器没有这份数据,需要进行登录 url = request.path return redirect(f'/login/?redirect_url={url}') return inner @wap def cart(request): return HttpResponse('购物车页面') @wap def info(request): return HttpResponse('个人信息页面')
Cookie 保存数据大小是有限制的,最大保存 4KB;
一个服务器最多在浏览器上保存 20 个 Cookie 数据;
一个浏览器最多保存 300 个 Cookie。
二、Session
Session 跟 Cookie不同的是 Session 数据是保存在服务器中。
当浏览器第一次请求去服务器的时候,服务器会生成一份 Session 的 id 编号给浏览器,是以 Cookie 的形式发给浏览器, 后续浏览器的请求,都会携带这个份 id 进行访问。
Session也是键值对的方式保存用户数据,Session 在服务器给每一个用户创建一个 Session 对象,对象的 id 值是保存在数据库中。
在操作 Session 的数据必须先迁移数据库。
def session_set(request): # 设置 Session 数据,通过 request 进行设置 # 保存 Session 数据之后,会自动生成 sessionid 的数据保存到数据库:django_session 表中 request.session['name'] = '阿宸' request.session['age'] = '27' # 设置过期时间 , 单位:秒 request.session.set_expiry(60) return HttpResponse('设置 Session 数据') def session_get(request): res = request.session.get('name') return HttpResponse(f'获取 Session 的数据为:{res}') def session_del(request): # 清楚过期的 Session 数据 # request.session.clear_expired() # del request.session['name'] # 清空所有的数据 # request.session.delete() request.session.flush() return HttpResponse('ok')
三、跨站点防御
CSRF:跨站点请求伪造
CSRF指攻击者盗用你的身份,以你的名义发送恶意请求(盗取你的账号 , 购买商品 , 窃取你的个人信息)
防止 CSRF 的攻击,Django 在中间件中做了 CSRF 的预防机制。
浏览器第一次访问 服务端的时候,Django 会自动随机生成 token 数据以 Cookie 形式发送给浏览器。当浏览器发送了 post 请求的时候,服务端都会进行自动检查 token是否和保存的一致。以这种方式进行避免 csrf 的攻击。
Django 配置的 中间件的 CSRF 只对 post 请求有效,get 请求无效