这里写目录标题
day 69
今天这一篇准备换一种格式
昨日内容补充
封装思路
- 先写面条版,完成功能再去考虑优化
- 尝试封装函数
- 尝试面向对象
今日内容概要
- forms 组件
- cookie 与 session
- 视图函数(CBV)如何添加装饰器
forms 组件源码
forms 组件源码的切入点
# forms 组件的所有功能基本都出自于该方法
def full_clean(self):
cookie 与 session 简介
保存在浏览器的信息都可以叫 cookie
- 用户一次登录成功以后,信息自动保存在浏览器本地。
- 之后访问的时候,自动将
保存在本地浏览器的用户名和密码
发送给服务端
- 服务端获取后自动验证。
cookie
- 保存在浏览器的 kv键值对,都可以叫 cookie
- 都是键值对的形式
- 安全优化 1 :
- 当登录成功以后,服务端产生一个随机字符串,交给浏览器客户端保存
- 服务端用 kv键值对的形式保存这个随机字符串
- 形式:随机字符串1:用户1信息
- 之后访问,都带着这个随机字符串
- 隐患:如果你拿到了随机字符串,也可以访问。
session
- 保存在服务端的 kv键值对(可以有多个)
- 经不住量大
token(下次再讲)
- 服务端不再保存数据,
- 用自己独有的方式,将一段用户信息加密处理
- 加密以后,拼接在信息后面,整体返回给浏览器保存。
- 浏览器下次访问的时候,带着信息,服务端切取前面一段信息,再次加密。跟浏览器尾部密文进行比对。
jwt 认证(后期会讲)
小总结
- cookie 在浏览器
- session 在服务端
- session 基于 cookie 工作。
- 大部分保存用户状态操作,都需要 cookie
cookie 操作
浏览器 / applications / cookies,里面有很多键值对
-
所有要用户登录的网站,都要保存cookie
-
浏览器可以选择拒绝保存
- 浏览器设置可以不允许保存。
- 然后登录页面都没了
最简单的操作原理
# 原本的 views 函数返回值
return HttpResponse()
# 操作 cookies 就改成这样
obj1 = HttpResponse()
return obj1
设置 cookie 和获取 cooke
# 设置
obj.set_cookie(key, value)
# 获取
request.COOKIES.get(key)
写一个真正的登录功能
# 装饰器
def login_auth(func):
'''
把 request 单独领出来,
如果拿得到 username,就继续。否则重定向到登录页面。
登录操作完成以后,要可以返回到最初想访问的页面
:param func:
:return:
'''
def inner(request, *args, **kwargs):
target_url = request.get_full_path()
if request.COOKIES.