zoukankan      html  css  js  c++  java
  • Django学习---cookie和session

    cookie

     客户端浏览器上的一个文件,以键值对的形式存储,如{“user”:“dacehgnzi”}

    入门:实现一个简单的登录功能

    views.py:

     1 user_info = {
     2     'dachengzi':{'pwd':'123456'},
     3     'root':{'pwd':'555555'},
     4 }
     5 def login(request):
     6     if request.method == 'GET':
     7         return render(request,'login.html')
     8     elif request.method == 'POST':
     9         name = request.POST.get('username')
    10         passwd = request.POST.get('passwd')
    11         dic = user_info[name]
    12         if not dic:
    13             return render(request,'login.html')
    14         elif dic['pwd'] == passwd:
    15             res = redirect('/index/')
    16             res.set_cookie('username',name)
    17             return res
    18         else:
    19             return render(request, 'login.html')
    20 def index(request):
    21     #获取当前已经登录的用户
    22     v = request.COOKIES.get('username')
    23     if not v:
    24         return redirect('/login/')
    25 
    26     return render(request,'index.html',{'current_user':v})

     想要往浏览器中添加cookie值,在跳转的时候set_cookie,想要获取cookie时就用request.COOKIE.get(''),

    获取cookie值:

    • request.COOKIES获得所有的cookie
    • request.COOKIES['cookie名称']
    • request.COOKIES.get('cookie名称')

    往浏览器中写cookie:在给用户返回内容的时候不仅要把内容返回给用户,还要把cookie返回给用户

      1.用一个变量,把要跳转赋值过去:response = render(requset,'返回的html')/redirect('返回的url')

      2.设置cookie值:response = set_cookie('key','value')设置cookie,关闭浏览器失效

      3.返回response:return response

    我们来看一下set_cookie函数:

    set_cookie(key,value,...)
    参数:
            key,              键
            value='',         值
            max_age=None,     超时时间,多少秒之后失效
          
    expires
    =None, 超时时间(IE requires expires, so set it if hasn't been already.),具体到某一个时间   import datetime
           current_date = datetime.datetime.utcnow()
           current_date = current_date + datetime.timedelta(seconds=5)
           response.set_cookie('username',name,expires = current_date)
         path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 domain=None, Cookie生效的域名 secure=False, https传输 httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)document.cookie:js中获取cookie

    案例:分页(通过cookie值设置每页显示多少条数据)

    我们先下载一个jquery cookie这个js,这样就可以通过jQuery获得cookie值,和设置cookie:

    html代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .pagination .page{
                display: inline-block;
                padding:5px;
                background-color: seashell;
                margin:5px;
            }
            .pagination .active{
                background-color: coral;
            }
        </style>
    </head>
    <body>
        <ul>
            {% for item in li %}
                {% include 'li.html' %}
            {% endfor %}
        </ul>
        <div>
            <select id="page_size" onchange="changePageSize(this)">
                <option value="10">10</option>
                <option value="20">20</option>
                <option value="30">30</option>
            </select>
        </div>
        <div class="pagination">
            {{ page_str|safe }}
        </div>
        <script src="/static/jquery-1.12.4.js"></script>
        <script src="/static/jquery.cookie.js"></script>
        <script>
            $(function () {
                v = $.cookie('per_page_count')获取cookie的值
                if(v == undefined){
                    v = 10
                }
                $("#page_size").val(v);
            });
            function changePageSize(ths){
                var v = $(ths).val()
                $.cookie('per_page_count',v);设置cookie的值
                location.reload()
            }
        </script>
    </body>
    </html>

    当然在这里面,我们也可以通过和django中cookie的一样的参数去设置url和过期时间

    我们是上面的cookie值都是明文的,那我们如果用密文呢?

    在django中有一个方法set_signed_cookie()方法,使用了这个方法设置出来的cookie值就是加密的:

    #加密,基于salt加密
    request.get_signed_cookie('username','kangbazi', default=RAISE_ERROR, salt='asdfasd', max_age=None)
        参数:
            default: 默认值
               salt: 加密盐
            max_age: 后台控制过期时间
    #解密
    request.get_signed_cookie('username',salt='asdfasd')

    salt的值要对应上才能解密

    Session

    cookie的缺点:

      我们js可以获取然后修改,这时候我们用户再访问就登录不上了

      如果我们把一些敏感信息放在cookie中,人家就可以看到。就会造成信息泄露

    所以基于Cookie做用户验证的时候不建议把敏感信息存储在cookie中

    cookie的优点:

      把存储数据的压力放在每个人的电脑上,减轻了服务器的压力

    1.Session原理

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

    session是保存在服务器端的键值对,session 依赖于 cookie。

      用户来请求,登录之后给他生成一个随机字符串,在服务器上保存,放置一个字典保存当前用户的信息

    入门:

    views.py:

     1 from django.shortcuts import render,HttpResponse,redirect
     2 
     3 # Create your views here.
     4 def login(request):
     5     if request.method == 'GET':
     6         return render(request,'login.html')
     7     elif request.method == 'POST':
     8         user = request.POST.get('user')
     9         pwd = request.POST.get('passwd')
    10         if user == 'root' and pwd == '123':
    11             #生成随机字符串
    12             #写到用户浏览器cookie
    13             #保存的到session中
    14             #在随机字符串对应的字典中设置相关的内容
    15             request.session['username'] = user
    16             request.session['is_login'] =True
    17             return redirect('/index/')
    18         else:
    19             return render(request,'login.html')
    20 def index(request):
    21     #获取当前用户的随机字符串
    22     #根据随机字符串获取对应的信息
    23     if request.session['is_login']:
    24         return HttpResponse(request.session['username'])
    25     else:
    26         return HttpResponse('去登录去')

    首先我们运行的时候要先生成数据库,makemigrations,migrate,然后再去执行,因为session是存储在数据库中的

    session操作:

        # 获取、设置、删除Session中数据
            request.session['k1']没有就报错
            request.session.get('k1',None)
            request.session['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.clear()就相当于reqeust.session.delete(request.session.session_key)
        # 在django中默认的超时时间为两周,我们可以通过下面的重新设置超时时间 request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。

     settings.py:

    a. 配置 settings.py
     
        SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    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,默认修改之后才保存(默认)

     上面我们的 session 是放置在数据库中,在django中,还可以把session存放在其他的地方:

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

     放在缓存中:

    settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

     放在文件中:

    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()     # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T

     缓存+数据库Session

    数据库用于做持久化,缓存用于提高效率
     
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

    加密cookie Session

    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
  • 相关阅读:
    Java基础之集合Collection一:
    Java基础之字符串String:
    Java基础之Map学习代码示例二:
    Jav基础之字符串缓冲区StringBuffer:
    Java基础之TreeSet集合使用泛型、比较器排序示例:
    Java基础之Map学习代码示例一:
    Java基础之StringBuilder
    Java基础之泛型限定的使用示例:
    Java基础之泛型的应用
    spark.primitives 包中的几个基本类
  • 原文地址:https://www.cnblogs.com/charles8866/p/8784349.html
Copyright © 2011-2022 走看看