cookie session token 中间件 cookie 与session原理 cookie基本操作 基于cookie实现登录认证 session基本操作  token    django中间件

为什么会有这些技术?
  1.目的是为了保存客户端的用户状态
  2.原因:HTTP协议是无状态的

  cookie
    保存在客户端浏览器上的键值对
    cookie虽然是保存在客户端浏览器上的键值对
    但是它是有服务端设置的
    浏览器有权禁止cookie的写入

django如何操作cookie
  小白必会三板斧
    obj = HttpResponse()
    # 利用obj对象你才可以操作cookie
    return obj

    obj = render()
    return obj

    obj = redirect()
    return obj

cookie基本操作

  如何设置cookie
    obj.set_cookie('k1','v1') # 告诉浏览器设置
  如何获取cookie
    request.COOKIES.get('k1') # 获取浏览器携带过来的cookie值
  如何设置cookie的超时时间
    obj.set_cookie('k1','v1',max_age=3)
    obj.set_cookie('k1','v1',expires=3)
    # 两个参数都是设置超时时间 并且都是以秒为单位
    # 区别:如果你要给IE浏览器设置cookie的超时时间 你只能用expires
  如何删除cookie(注销 退出登录)

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            obj = redirect('/home')
            obj.set_cookie('whoami', 'jason')
            return obj
    return render(request, 'login.html')


def home(request):
    if request.COOKIES.get('whoami'):
        return render(request, 'home.html')
    return redirect('/login/')

基于cookie实现登录认证

登录装饰器

from functools import wraps
def login_auth(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
        # 判断当前用户是否登录
        # print('request.path_info:',request.path_info)  # 只获取url
        # print('request.get_full_path():',request.get_full_path())  # url+get参数
        if request.COOKIES.get('whoami'):
            res = func(request,*args,**kwargs)
            return res
        else:
            target_path = request.path_info
            return redirect('/login/?next=%s'%target_path) #登录前想访问的页面携带
    return inner
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            # 登录成功
            old_path = request.GET.get('next')
            if old_path:  # 防止用户直接访问的login页面
                obj = redirect(old_path)
            else:
                obj = redirect('/home/')  # 默认跳转到首页 当用户没有想要访问的网址
            obj.set_cookie('whoami','jason')  # 告诉浏览器保存一个键值对
            return obj
    return render(request,'login.html')

注销功能

def logout(request):
    obj = redirect('/login/') # 注销后默认跳到登录页面
    obj.delete_cookie('whoami')
    return obj

session基本操作

session
  保存在服务端上面的键值对
  session的工作机制是需要依赖于cookie的


  设置session
    request.session['k1'] = 'v1'
    # 第一次设置的时候会报错 是因为你没有执行数据库迁移命令 生成django需要用到的一些默认表(django_session)

  """
  django默认的session失效时间是14天 2周
  """
  request.session['k1'] = 'v1'
  """
  上面这一句话到底发生了哪些事儿
    1.djang内部自动帮你调用算法生成一个随机的字符串
    2.在django_session添加数据(数据也是加密处理)
      随机字符串    加密之后的数据    失效时间
         ashdjsad      jsadsada
    3.将产生的随机字符串返回给客户端浏览器 让浏览器保存
      sessionid:随机字符串

  """

获取session
  request.session.get('k1')
  """
    1.django内部会自动去请求头里面获取cookie
    2.拿着sessionid所对应的随机字符串去django_sessoion表中一一比对
    3.如果比对上了 会将随机字符串对应的数据获取出来 自动放入request.session*程序员调用
    如果没有就是一个空字典
  """


删除session
  request.session.delete()
  客户端和服务端全部删除 只会根据浏览器的不同删对应的数据

  request.session.flush() # 建议使用这个 只删客户端的session数据



如何设置失效时间
  # 设置会话Session和Cookie的超时时间
  request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。


django session在创建数据的时候 是针对浏览器的

能够作为数据库的有哪些
  数据库软件
  关系型
  非关系型
  文件
  内存

 token  

https://www.cnblogs.com/moyand/p/9047978.html

 cookie session token 中间件
cookie 与session原理
cookie基本操作
基于cookie实现登录认证
session基本操作
 token  
 django中间件

 cookie session token 中间件
cookie 与session原理
cookie基本操作
基于cookie实现登录认证
session基本操作
 token  
 django中间件

 django中间件

cookie session token 中间件
cookie 与session原理
cookie基本操作
基于cookie实现登录认证
session基本操作
 token  
 django中间件

django默认有七个中间件
  只要你想要做一些网站的全局性功能 你都应该考虑使用django的中间件
    1.全局的用户登录校验
    2.全局的用户访问频率校验
    3.全局的用户权限校验() 20行代码 100+ RBAC
  django的中间件是所有框架里面做的最完善的



对象    字符串    》》》      反射
全局          》》》    中间件

并且支持用户自定义中间件 然后暴露给用户五个可以自定义的方法
  需要掌握
  process_request(******)
    1.请求来的时候会按照settings配置文件中从上往下的顺序 依次执行每一个中间件内部定义的process_request方法
如果中间件内部没有该方法 直接跳过执行下一个中间件
    2.该方法一旦返回了HttpResponse对象,那么请求会立刻停止往后走 原路立即返回

  process_response
    1.响应走的时候会按照settings配置文件中从下往上的顺序 依次执行每一个中间件内部定义的process_response方法
    2.该方法必须有两个形参 并且必须返回response形参 不返回直接报错
    3.该方法返回什么(HttpResponsed对象) 前端就能获得什么

# 当process_request方法直接返回HttpResponse对象之后 会直接从当前中间件里面的process_respone往回走
# 没有执行的中间件都不会再执行


需要了解
  process_view(self,request,view_name,*args,**kwargs)
    1.路由匹配成功之后执行视图函数之前触发
    2.如果该方法返回了HttpResponse对象 那么会从下往上一次经过每一个中间件里面的process_response方法
  process_template_response
    1.当你返回的对象中含有render属性指向的是一个render方法的时候才会触发 从下往上的顺序
    def mdzz(request):
      print('我是视图函数mdzz')
      def render():
        return HttpResponse('你好呀 我是奇葩')
      obj = HttpResponse('我很好 好的像个傻逼一样')
      obj.render = render
      return obj
  process_exception
  1.当视图函数中出现错误 会自动触发 顺序是从下往上
上面这五个方法 会在特定的阶段自动触发

# 如果形参中含有response 那么必须要返回