• django学习之- Cookie


    cookie:客户端游览器上的一个文件,以键值对进行保存,类似字典{'k':'sfs'},与服务器端没有关系,当游览器访问服务器时候,服务器会
    生成一个随机字符串保存在cookie中返回给客户端,这样当客户端游览器下次访问服务器端时候,会带着这个保存了服务器端的随机字符串的
    cookie访问服务器,服务器端收到请求后,经过检查此cookie已存在此随机字符串,表示此客户端为已通过认证的状态,可以直接登录。
    举例:
    通过帐号登录服务器后,服务器端对cookie进行username标识,等客户端下一次访问时候,服务器端先提取cookie的username,如果不为空,表示为已登录帐号
    def login(request)
        u = request.POST.get('name')
        # 对登录帐号进行验证,如果通过,执行下面
        res = redirect('/index')
        res.set_cookie('username',u)
        return res
    
    在index的函数直接提取当前登录的帐号是否匹配
    def index(request)
        #提取游览器中的cookie,如果不为空,表示为已登录帐号
        v = request.COOKIES.get('username')
        if not v:
            return redirect('/login')
        return render(request,'index.html',{'curr_name':v}
    View Code
    这时,页面使用{{curr_name}}可以直接获取登录帐号名称

    游览器查看cookie的方法:这里的cookie可以通过游览器的“审查元素”-> "network" -> "Cookies" 看到

    request.COOKIES:包含用户发来的所有数据,这个COOKIES就是一个字典,获取方法有以下2种
    获取cookis,获取用户发来请求中的cookies
    request.COOKIES['username111']
    request.COOKIES.get('username111')

    设置cookies,服务器端返回给客户端,并写入cookies
    response = render(request,'index.html')
    response = redirect('/index/')
    # 设置cookie,关闭游览器自动失效
    response.set_cookie('key','value')
    return response
    # 设置cookies超过10秒失效,写法
    response.set_cookie('key','value',max_age=10)
    # 从登录10秒后失效,写法
    current_time = datetime.datetime.utcnow()
    current_data = current_time + datetime.timedelta(seconds=10)
    response.set_cookie('key','value',expires=current_data)

    rep.set_cookie(key,value,...)
    rep.set_signed_cookie(key,value,salt='加密盐',...)
    参数:
    key, 键
    value='', 值
    max_age=None, 超时时间
    expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
    path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
    domain=None, Cookie生效的域名
    secure=False, https传输
    httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

    cookie 将字符串进行salt加解密,写法如下:
    obj = HttpResponse('s')
    obj.set_signed_cookie('username','jack',salt='adfadf') # 通过salt进行加密
    request.get_signed_cookie('username',salt='adfadf') # 通过原来的salt进行解密

    注意:获取cookies写法:request.COOKIES.get('名称') 设置cookies写法:response.set_cookie('key','value')

    实例:userlist通过cookie实现页面显示数量
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>分页</title>
        <style>
            .page {
                background:#9acfea;
                padding: 5px;
                margin:5px;
            }
            .active{
                background:red;
            }
        </style>
    </head>
    <body>
        <ul>
            {% for i in li %}
            {% include 'li.html' %}
            {% endfor %}
        </ul>
    {#    {{ page_str|safe }}#}
        <div style="float: left;">
            <select id='ps' onchange="changePageSize(this);">
                <option value="10">10</option>
                <option value="50">50</option>
                <option value="100">100</option>
            </select>
        </div>
        <div style="float: left;">
            {{ page_str }}
        </div>
    <script src="/static/jquery-1.12.4.min.js"></script>
    <script src="/static/jquery-cookie/jquery.cookie.js"></script>
    <script>
        /*select选项框修改为当前显示数量*/
        $(function () {
            var v = $.cookie('per_page_count',{'path':"/ug/userlist"});
            $('#ps').val(v)
        });
        /*select选项框选择后自动刷新页面*/
        function changePageSize(ths) {
            var v = $(ths).val();
            $.cookie('per_page_count',v,{'path':"/ug/userlist"});
            location.reload();
        }
    </script>
    </body>
    </html>
    View Code

     实例:FBV实现一个帐号登录后,保持10秒,并使用装饰器检查每个URL都为帐号登录状态

    def auth(func):
        ''' 装饰器,检查当前游览器cookies里logname是否存在已登录的帐号,如果存在,则继续执行下面的函数,返回计划进入的url'''
        def inner(request,*args,**kwargs):
            v = request.COOKIES.get('logname')
            if not v:
                return redirect('/')
            return func(request,*args,**kwargs)
        return inner
    
    def login(request):
        '''登录url '''
        if request.method == 'GET':
            return render(request,'login.html')
    
    
    def index(request):
        if request.method == 'GET':
           '''get模式,获取cookies的logname帐号名,如果为空则返回登录页面 '''
            u = request.COOKIES.get('logname')
            if not u:
                return redirect('/')
            if request.COOKIES['logname'] == 'admin':
                alluser = models.UserName.objects.exclude(uname='admin')
            else:
                # loguser = request.session['username']
                loguser = request.COOKIES['logname']
                alluser = models.UserName.objects.filter(uname=loguser)
            return render(request, 'index.html', {'u_list': alluser})
        if request.method == 'POST':
            '''帐号登录验证 '''
            logname = request.POST.get('logname',None)
            logpwd = request.POST.get('logpwd',None)
            if models.UserName.objects.filter(uname=logname):
                if models.UserName.objects.filter(uname=logname,upwd=logpwd):
                    # 登录验证成功,重写cookie的登录帐号,延时10秒
                    response = HttpResponse('ok')
                    response.set_cookie('logname',logname,max_age=10)
                    return response
                else:
                    return HttpResponse('pwderr')
            else:
                return HttpResponse('nmerr')
    
    @auth  # 装饰器,在访问url为account时候,验证帐号是否为登录状态
    def account(request):
        if request.method == 'GET':
            return render(request,'account.html')
    '
    View Code

     实例:CBV通过装饰器实现用户登录认证

    from django import views
    from django.utils.decorators import method_decorator
    @method_decorator(auth,name='dispatch')
    class Order(views.View):
        def get(self,request):
            v = request.COOKIES.get('logname')
            return render(request,'index.html',{'current_user':v})
    
        def post(self,request):
            v = request.COOKIES.get('logname')
            return render(request,'index.html',{'current_user':v})
    View Code
  • 相关阅读:
    Activity中Intent的知识
    详解 Android 的 Activity 组件
    Android xml资源文件中@的含义
    为App签名的其他方法
    如何将Android程序打包成apk文件
    创建Android虚拟设备(AVD)
    Android开发环境搭建
    论适应和麻木
    一些有趣的图片
    python 写一个scheme 解释器 (二)——简单求值器内核
  • 原文地址:https://www.cnblogs.com/zy6103/p/7990168.html
Copyright © 2020-2023  润新知