day_58

匆匆过客 提交于 2019-12-28 02:06:39

cookie与session原理

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

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

​ token 加密字符串
​ 加密算法 xxx

​ username >> (xxx) >> 随即字符串

django操作cookie
小白必会三板斧

obj = HttpResponse()
# 利用obj对象你才可以操作cookie
return obj

obj = render()
return obj

obj = redirect()
return obj

如何设置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 logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("user")  # 删除用户浏览器之上设置的usercookie值
    return rep

基于cookie实现的登录认证装饰器

from functools import wraps
def login_auth(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
        # 判断当前用户是否登录

        if request.COOKIES.get('whoami'):
            res = func(request,*args,**kwargs)
            return res
        else:
            target_path = request.path_info # 获取用户想要访问的url
            return redirect('/login/?next=%s'%target_path)  # 将url添加到login后面,方便获取
    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:
                obj = redirect(old_path)  # 登陆成功实现跳转
            else:
            
                 obj = redirect('/home/')
            obj.set_cookie('whoami','jason',max_age=5)
            return obj
    return render(request,'login.html')

session

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

​ 设置session

request.session['k1'] = 'v1'
# 第一次设置的时候会报错   因为你没有执行数据库迁移命令  生成django需要用到的一些默认表(django_session)
'''
django默认的session失效时间是14天    2周
'''
'''
上面这句话发生了什么事情?
    1.django内部自动帮你调用算法生成一个随机的字符串
    2.在django_session添加数据(数据也是加密处理)
        随机字符串         加密之后的数据           失效时间
        ashdjsad            jsadsada
    3.将产生的随机字符串返回给客户端浏览器    让浏览器保存
        sessionid:随机字符串

获取sessin

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

删除session

request.session.delete()  # 客户端和服务端都删了
request.session.flush()  # 推荐使用

设置失效时间

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

django中间件

​ 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('你好呀 我是2B')
    obj = HttpResponse('我很好 好的像个SB一样')
    obj.render = render
    return obj

​ process_exception
​ 1.当视图函数中出现错误 会自动触发 顺序是从下往上
​ 上面这五个方法 会在特定的阶段自动触发

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!