• day60


    Cookie与Session组件

    一、cookie:

      由于Http协议的无状态的特点,也就是说即使第一次和服务器连接后并且登录成功后,

    第二次请求服务器依然不能知道当前请求是哪个用户,cookies的出现就是为了解决这一现象。

    cooki就是保存在客户端浏览器上的键值对:

    工作原理:当用户登录成功后,浏览器上会保存一些信息,下次再来访问的时候,就会携带着这些信息去访问服务端,服务端通过这些信息来识别出你的身份

    7  二、session:

      session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,

    不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。

       session就是保存在服务器上的键值对
    session虽然是保存在服务器上的键值对
    但是它是依赖于cookie工作的

    cookie就是保存在客户端浏览器上的键值对,点击查看已经登录了的Cookie,会自动保存一些信息

    img

    查看cookie的方法

    img

    如何操作cookie和session

      前提分析:Django返回给客户端浏览器的都必须是HttpResponse对象;

    三板斧:

      return HttpResonse(): 返回字符串

      return render() 返回html页面

      return redirect() 重定向到...

    Django操作cookie

      通过对cookie的操作,让服务器如何存储数据信息,保存用户的登录状态,简单的写一个都登录注册的例子:

    首先先掌握如何操作cookie:

    获取cookie的方法

      request.COOKIE.get()

    request.COOKIES['key']
    request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
    

    参数:

    • default: 默认值
    • salt: 加密盐
    • max_age: 后台控制过期时间

    设置Cookie

    rep = HttpResponse(...)
    rep = render(request, ...)
    
    rep.set_cookie(key,value,...)
    rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)
    

    设置超时时间

    max_age=None, 超时时间expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)		
    

    删除Cookie

    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
        return rep
    

    cookie登录版的校验

    views,py

    def lg(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            if username == 'jack' and password == '123':
                # 先获取url中get请求携带的参数
                old_url = request.GET.get('next')
                # 判断用户是直接访问的登陆页面 还是从别的页面的调过来
                if old_url:
                    obj = redirect(old_url)
                else:
                    # 如果用户直接访问的登陆页面 那么登陆完成之后 直接跳到网站的首页
                    obj = redirect('/home/')
                obj.set_cookie('name','jason',max_age=30)  # 浏览器上就会保存键值对name:jack
                return obj
        return render(request,'login.html')
    

    home返回主页面的功能

    def home(request):
        if request.COOKIES,get('name'):
            return HttpResonse('home主页面,只有登录了才可以进来!')
        return redirect('login')
        return HttPResonse('home页面,只有登录了才能看!')
    

    如果页面过多,访问时都需要设置先登录,这时候就想到了设置一个登录装饰器,在全局哪里需要就往那里加。

    from functools import wraps
    
    def login_auth(func):
        @wraps(func)
        def inner(request,*args,**kwargs):
            # 从request中获取cookie
            # print(request.path)
            # print(request.get_full_path())
            target_url = request.get_full_path()# 获取url的后缀/?next=%s
            if request.COOKIES.get('name'):
                res = func(request,*args,**kwargs)
                return res
            else:
                return redirect('/login/?next=%s'%target_url)
        return inner
    

    利用装饰器,开设其他跳转页面功能

    @login_auth
    def index(request):
        return HttpResponse("index页面 只有登录了才能访问")
    
    @login_auth
    def xxx(request):
        return HttpResponse('xxx页面 登陆之后才能看')
    

    注销功能删除cookie保存的数据,下次登录就不会再保存原有的数据进行校验,得重新登录

    def logout(request):
        obj = redirect('/lg/')
        obj.delete_cookie('name')
        return obj
    

    login.html前端的简单书写from表单,按钮实现登录接口

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    </head>
    <body>
    <form action="" method="post">
        <p>username:
            <input type="text" name="username">
            <span style="color: red">{{ errors.username }}</span>
        </p>
        <p>password:
            <input type="password" name="password">
            <span style="color: red">{{ errors.password }}</span>
        </p>
        <input type="submit">
    </form>
    </body>
    </html
    

      分析以上页面之间跳转的实现原理:基于cookie的原理,用获取和设置cookie,保存cookie所保存的用户数据信息,

    下次再次访问的时候携带上cookie在客户端保存的用户信息进行校验比对,是否属于登录的状态,登录成功或自动保存。

    session的操作

      获取、设置、删除Session中数据

    request.session['k1']
    request.session.get('k1',None) 取值一般应set的方式
    request.session['k1'] = 123 赋值
    request.session.setdefault('k1',123) # 存在则不设置
    del request.session['k1']
    

    session保存在服务端的,数据保存在Django默认自带的数据库表,当执行数据迁移命令的时候都会自带一个django_session表;

    img

    session所携带的表字段,其中的时间exprie_time采用的是UTC时间,相差个小时

    img

    Django默认的超时实际时间是14天

    重点掌握设置和获取session

    设置session
    request.session['name'] = 'jack'
    """
    上面这一句话发生了三件事
        1.django 内部自动生成一个随机字符串
        2.将随机字符串和你要保存的数据 写入django_session表中(先在内存中生成一个缓存记录,等到经过中间件的时候才会执行)
        3.将产生的随机字符串发送给浏览器写入cookie
            sessionid:随机字符串
    """
    获取session
    request.session.get('name')
    """
    上面这一句话发生了三件事
        1.django内部会自动从请求信息中获取到随机字符串
        2.拿着随机字符串去django_session表中比对
        3.一旦对应上了就将对应的数据解析出来放到request.session中
    
    """
    

    方法的使用

    def set_session(request):
        # request.session['name'] = 'jason'
        # request.session['name1'] = 'jason1'
        request.session['xxx'] = 'xxx'
        request.session.set_expiry(30)
        return HttpResponse('set_session')
    
    def get_session(request):
        # print(request.session.get('name'))
        # print(request.session.get('name3'))
        print(request.session.get('xxx'))
        return HttpResponse('set_session')
    
    def delete_session(request):
        # request.session.delete('xxx')
        request.session.flush()
        return HttpResponse('delete_session')
    

    解析:

    删除当前会话的所有Session数据
    request.session.delete() # 删除的是浏览器的sessionid信息
      
    # 删除当前的会话数据并删除会话的Cookie。
    request.session.flush()  # 将浏览器和服务端全部删除
    这用于确保前面的会话数据不可以再次被用户的浏览器访问
    例如,django.contrib.auth.logout()
    函数中就会调用它。
    
    # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
    *如果value是个整数,session会在些秒数后失效。
    *如果value是个datatime或timedelta,session就会在这个时间后失效。
    *如果value是0, 用户关闭浏览器session就会失效。
    *如果value是None, session会依赖全局session失效策略。
    
  • 相关阅读:
    让eclipse中选中的变量以指定颜色高亮显示
    IDirect3DDevice9::DrawPrimitive
    3D中的切线空间简介(转)
    Scenario 3: Drawing One Triangle with Indexing
    Scenario 2: Drawing Two Triangles with Indexing
    aswing学习笔记
    aswing学习笔记4通过调用面板中的按钮实现主界面动态切换皮肤的问题!
    flexBuilder3中生成的模板页不支持flash全屏的修改办法
    Eclipse和FlexBuilder中设置编辑代码高亮
    aswing学习笔记2不规则外框请教思路
  • 原文地址:https://www.cnblogs.com/xwjhyy/p/11983983.html
Copyright © 2020-2023  润新知