zoukankan      html  css  js  c++  java
  • Django-website 程序案例系列-10 cookie 和 session的应用

    cookie:  现在所有网站基本都要开启cookie

      客户端浏览器上的一个文件

      例如:   {‘key’: 'sefwefqefwefw'} 是一个键值对

    简单实现cookie认证:

    user_in = {
        'zhangjian': {'pwd': '123'},
        'xiefengmei': {'pwd': '123'},
    }
    def log(request):
        if request.method == 'GET':
            return render(request, 'log.html')
        if request.method == 'POST':
            u = request.POST.get('username')
            p = request.POST.get('pwd')
            dic = user_in.get(u)
            if not dic:
                return render(request, 'log.html')
            if dic['pwd'] == p:
                res = redirect('/tpl/')
                res.set_cookie('username', u)
                return res
            else:
                return render(request, 'log.html')
    
    def tpl(request):
        v = request.COOKIES.get('username')
        if not v:
            return redirect(request, '/log/')
        return render(request, 'tpl.html', {'current_user': v})
    

    HTML

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>{{ current_user }}</h1>
    </body>
    </html>
    

    获取客户端的cookie:

    request.COOKIES

    request.COOKIES['username111']

    request.COOKIES.get('username111')

    设置用户cookie:

    response = render(request, 'index.html')

    response = redirect('/index/')

    response.set_cookie('key',‘value’) #这种方式只能设置cookie, 关闭浏览器就会失效

    return response

    设置加密的cookie:

    obj = HttpResponse('s')

    obj.set_signed_cookie('username',"zhangjian",salt="wioahf2i3")  #设置加密的cookie,salt是一个加密字符串

    request.get_signed_cookie('username',salt="wiioahf2i3") #接收加密的cookie,利用salt解密

    cookie参数:

    超时时间:

       1.response.set_cookie('key',‘value’,max_age=10) # max_age过期时间,cookie失效时间,多少秒之后失效

       2. import datetime

        current_date = datetime.datetime.utcnow() + datetime.timedelta(seconds=10)

        response.set_cookie('key',‘value’,expires=current_date)  # expires是到什么时间失效

    路径:

      response.set_cookie('key',‘value’,path=‘/’)  #cookie生效的路径, ‘/’表示根路径,根路径的cookie可以被任何url访问

    域名:

      response.set_cookie('key',‘value’,domain=None) #cookie生效的域名

    其他:

      response.set_cookie('key',‘value’,secure=False) #如果是https的网站需要,改为True

      response.set_cookie('key',‘value’,httponly=False) #表示只能使用http协议传输,无法使用javascript获取(document.cookie)

    JS操作cookie:

    def user_list(request):
        current_page = request.GET.get('p', 1)
        current_page = int(current_page)
        val = request.COOKIES.get('per_page_count',10)       #取出前端JS传来的cookie里面的 ‘per_page_count’ ,默认值设置为10
        page_obj = Page(current_page, len(LIST), int(val)) 
    
        data = LIST[page_obj.start: page_obj.end]
    
        page_str = page_obj.page_str("/user_list/")
        return render(request, 'user_list.html', {'li': data, 'page_str': page_str})

    HTML

        <script src="/static/jquery.min.js"></script>
        <script src="/static/jquery.cookie.js"></script>
        <script>
            $(function() {    #网页加载时运行          
                var v = $.cookie('per_page_count');   #加载网页时 取cookie里面‘per_page_count’的值v
                $('#ps').val(v);             #将值v设置到 id=ps 的标签里面
            });
    
            function changePageSize(ths) {
                var v = $(ths).val();           #绑定 onchange事件得到值 v
                $.cookie('per_page_count', v);  #将 v 设置到 键为‘per_page_count’里面
                location.reload();              #刷新网页
            };
    
        </script>
    

      

     简单的用JS设置一个cookie:

    基于cookie做用户验证时:敏感信息不适合放在cookie中

    session原理:

      cookie是保存在用户浏览器的键值对

      session是保存在服务器端的键值对

        例如: session = afhashebwf213@!#: {

                  'is_login': True,

                  'user': 'zhang'

                  'nid': ...

                  ...

                }

    # 基于session做用户验证
    def logi(request): if request.method == "GET": return render(request, 'logi.html') elif request.method == "POST": user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'root' and pwd == "123": request.session['username'] = user # 给session中设置值 request.session['is_login'] = True  # 给session中设置值  return redirect('/ind/') else: return render(request, 'logi.html') def ind(request): if request.session['is_login']: # 获取session中的值 return HttpResponse(request.session['username']) else: return HttpResponse('请你登录')

      

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

    request.session['k1']  #取k1的值 如果不存在报错
    request.session.get('k1',None)  #取k1的值 如果不存在返回None
    request.session['k1'= 123   #设置k1的值为123
    request.session.setdefault('k1',123# 存在则不设置
    del request.session['k1']  #删除k1
     
    # 所有 键、值、键值对
    request.session.keys() 
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()
     
    # 用户session的随机字符串
    request.session.session_key
     
    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()
     
    # 检查 用户session的随机字符串 在数据库中是否
    request.session.exists("session_key")
     
    # 删除当前用户的所有Session数据
    request.session.delete("session_key")
     
    request.session.set_expiry(value)
          * 如果value是个整数,session会在些秒数后失效。
          * 如果value是个datatime或timedelta,session就会在这个时间后失效。
          * 如果value是0,用户关闭浏览器session就会失效。
          * 如果value是None,session会依赖全局session失效策略。
     
    #注销时清空session
    def logout(request):
         request.session.clear()
         return redirect('/login/')
    

    #设置session来实现免登陆

    <form action="/logi/" method="POST">
        <input type="text" name="user"/>
        <input type="text" name="pwd"/>
        <input type="checkbox" name="rmb" value="1" /> 10秒免登陆
        <input type="submit" value="提交"/>
    </form>
    
    def logi(request):
        if request.method == "GET":
            return render(request, 'logi.html')
        elif request.method == "POST":
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            if user == 'root' and pwd == "123":
                request.session['username'] = user
                request.session['is_login'] = True
                if request.POST.get('rmb',None) == '1':
                    request.session.set_expiry(10)  # 超时时间
                return redirect('/ind/')
            else:
                return render(request, 'logi.html')
    

    #session配置文件及其参数:

    settings.py里面配置管理

         SESSION_ENGINE = 'django.contrib.sessions.backends.cache'    # 引擎

        SESSION_CACHE_ALIAS = 'default'                                                   # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
     
        SESSION_COOKIE_NAME = "sessionid"                                             # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
        SESSION_COOKIE_PATH = "/"                                                           # Session的cookie保存的路径
        SESSION_COOKIE_DOMAIN = None                                                        # Session的cookie保存的域名
        SESSION_COOKIE_SECURE = False                                                      # 是否Https传输cookie
        SESSION_COOKIE_HTTPONLY = True                                                    # 是否Session的cookie只支持http传输
        SESSION_COOKIE_AGE = 1209600                                                       # Session的cookie失效日期(2周)
        SESSION_EXPIRE_AT_BROWSER_CLOSE = False                                   # 是否关闭浏览器使得Session过期
        SESSION_SAVE_EVERY_REQUEST = False                                            # 是否每次请求都保存Session,默认修改之后才保存(每次用户操作需不需要更新过期时间)

    #  引擎的配置Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

    • 数据库(默认)
    • 缓存
    • 文件
    • 缓存+数据库
    • 加密cookie

     1. 数据库:

      SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 表示把session放在数据库中

     2. 缓存:

       SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 表示把session放在缓存中存储

       SESSION_CACHE_ALIAS = 'memcache-1'
      
        CACHES = {    # 例如memcache连接信息
            'memcache-1': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
                'LOCATION': [
                    '172.19.26.240:11211',
                    '172.19.26.242:11211',
                ]
            }
        }
    3. 文件:
        SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 表示把session存储在临时文件中
        SESSION_FILE_PATH = os.path.join(BASE_DIR,'cache')    # 表示存储session的临时文件的文件路径
    4. 缓存+数据库同时使用:
          SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' 
    5. 加密cookie
         SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
     
     
     
     
     
     
  • 相关阅读:
    IT职业选择与定位
    零碎时间应该拿来做什么
    编程漫谈(七):意义与自由
    第一次项目发布的心得体会
    入职一月的一点感想
    职业发展思考(一)
    健康先行: 每天锻炼一小时!!!
    2012, 软件职场之旅启程
    程序员的成长之路
    计算机学习方法
  • 原文地址:https://www.cnblogs.com/kuku0223/p/7921923.html
Copyright © 2011-2022 走看看