zoukankan      html  css  js  c++  java
  • Cookie-Session

    Cookie

    cookie就是保存在浏览器本地的一组组键值对

    HTTP协议是无状态的,每次请求都是独立的,不受前面的请求响应情况直接影响,也不会影响后面的请求响应,对服务器来书,每次的请求都是全新的

    特性:

    1.服务器让浏览器进行设置的

    2.保存在浏览器本地

    3.浏览器下次访问时自动携带响应的cookie

    作用:

    1.登录校验

    2.保存用户的浏览习惯

    3.简单的投票

    Django操作

    # 设置
    ret = redirect('/home/')
    ret.set_cookie('is_login', '1',max_age=5)   # 普通的cookie '键','值',超时时间
    ret.set_signed_cookie('is_login', '1', max_age=5,'day62')  # 加密的cookie  第四个参数加盐
    
    # 获取
    request.COOKIES['']   
    request.COOKIES.get('')
    request.get_signed_cookie('',salt='',default='')
    
    # 删除
    ret = redirect('/login/')
    ret.delete_cookie('')

    登录校验

    from django.shortcuts import render,redirect,HttpResponse
    from django.views import View
    
    # 装饰器
    def login_required(func):
        def inner(request,*args,**kwargs):
            is_login = request.COOKIES.get('is_login')    # 通过字典的键取值
            if is_login == '1':
                ret = func(request,*args,**kwargs)
            else:
                return_url = request.path_info
                ret = redirect('/login/?return_url={}'.format(return_url))    # 将当前访问的地址拼接到login地址后,登录成功后再跳转回来
            return ret
        return inner
    
    
    def login(request):
        if request.method == 'POST':
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            if user == 'alex' and pwd == '123':
                return_url = request.GET.get('return_url')
                if return_url:
                    ret = redirect(return_url)
                else:
                    ret = redirect('/home/')
                ret.set_cookie('is_login','1')
                # ret.set_signed_cookie('is_login','1','sss')    # 加密
                return ret
            else:
                return render(request,'login.html', {'err_msg':'用户名或密码错误'})
        return render(request,'login.html')
    
    
    @login_required
    def home(request):
        return HttpResponse('<h1>home</h1>')
    
    
    @login_required
    def index(request):
        return HttpResponse('<h1>index</h1>')
    
    
    def logout(request):
        ret = redirect('/login/')
        ret.delete_cookie('is_login')   # 通过字典的键删除
        return ret
    示例

    Session

    保存在服务器上的一组组键值对,必须依赖于cookie

    cookie保存在浏览器本地,不安全,可能被拦截或窃取

    cookie本身最大支持4096字节,大小有限制

    当浏览器首次访问服务器时,服务器会在自己的数据库文件中记录一组键值对,键是随机生成的,值是浏览器所提交的数据,比如账号密码等,将键返回给浏览器的cookies

    保存,这样用户再访问时,通过cookies所携带的唯一id进行验证

    django操作

    # 获取、设置、删除Session中数据(通过字典的形式进行操作)
    request.session['k1']
    request.session.get('k1',None)
    request.session['k1'] = 123
    request.session.setdefault('k1',123)      # 存在则不设置
    del request.session['k1']
    
    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
    
    # 会话session的key
    request.session.session_key
    
    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()    # 默认为两周
    
    # 检查会话session的key在数据库中是否存在
    request.session.exists("session_key")
    
    # 删除当前会话的所有Session数据
    request.session.delete()
      
    # 删除当前的会话数据并删除会话的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失效策略。

    流程解析

    登录校验

    # 装饰器
    def login_required(func):
        def inner(request, *args, **kwargs):
             # 获取session的值
            is_login = request.session.get('is_login')
                    if is_login == '1':
                ret = func(request, *args, **kwargs)
            else:
                # 获取要访问的地址  拼接到login地址后
                return_url = request.path_info
                ret = redirect('/login/?return_url={}'.format(return_url))
            return ret
        return inner
    
    def login(request):
        if request.method == 'POST':
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            if user == 'alex' and pwd == '123':
                return_url = request.GET.get('return_url')
                if return_url:
                    ret = redirect(return_url)
                else:
                    ret = redirect('/home/')
                # 设置session
                request.session['is_login'] = '1'
                return ret
            else:
                return render(request,'login.html', {'err_msg':'用户名或密码错误'})
        return render(request,'login.html')
    
    
    @login_required
    def home(request):
        return HttpResponse('<h1>home</h1>')
    
    
    @login_required
    def index(request):
        return HttpResponse('<h1>index</h1>')
    
    
    def logout(request):
        request.session.flush()         # 删除当前的会话数据并删除会话的Cookie
        return redirect('/login/')
    示例
  • 相关阅读:
    lsyncd实时同步搭建指南——取代rsync+inotify
    Linux内存管理
    [Python爬虫] 之十一:Selenium +phantomjs抓取活动行中会议活动信息
    [Python爬虫] 之十:Selenium +phantomjs抓取活动行中会议活动
    [Python爬虫] 之九:Selenium +phantomjs抓取活动行中会议活动(单线程抓取)
    python 正则表达式
    Scrapy 安装
    python 安装whl文件
    [Python爬虫] 之八:Selenium +phantomjs抓取微博数据
    [Python爬虫] 之七:selenium webdriver定位不到元素的五种原因及解决办法(转载)
  • 原文地址:https://www.cnblogs.com/sandy-123/p/10690887.html
Copyright © 2011-2022 走看看