Django框架基于Cookie实现用户登录、带签名的Cookie

鳄鱼君

发表文章数:531

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python教程 » Django框架基于Cookie实现用户登录、带签名的Cookie

cookie对于网站来说非常重要,几乎所有涉及用户登录操作的网页都需要使用cookie,如果你在浏览器中禁止掉了cookie,那么你就永远登录不上网页,你可以随便找个网站,试着禁掉浏览器的cookie,看能否登录成功,答案肯定是不行!

在django使用cookie非常简单,那么我们先来看一下cookie的使用方法:

1.获取Cookie:

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数:
    default: 默认值
       salt: 加密盐
    max_age: 后台控制过期时间

2、设置Cookie:

    
rep = HttpResponse(...) 或 rep = render(request, ...)
 
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的方法,来修改我们的views.py视图中的代码:

def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    if request.method=='POST':
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        if not u:
            return render(request,'login.html')
        if u=='root' and p=='123':#登录成功
            res=redirect('/index/')   #返回给用户首页
            #设置cookie,关闭浏览器就会失效
            res.set_cookie('username',u)
            #设置cookie,5秒失效
            res.set_cookie('username',u,max_age=5)
            #设置cookie,截止时间失效
            import datetime
            cur_date=datetime.datetime.utcnow()  #获取当前时间
            cur_date=cur_date + datetime.timedelta(seconds=5)  #当前时间加上5s钟,5s中过期
            print(cur_date)
            res.set_cookie('username',u,expires=cur_date)
            return res
        else:
            return render(request,'login.html')

重点就是设置cookie的方式,代码不够完整,只需要知道设置cokie的几种方式就可以了,那么在index函数中我们就可以获取cookie,判断是否存在设这样的用户。

def index(request):
    #request.COOKIES['username']  获取获取
    u=request.COOKIES.get('username')  #获取登录成功设置的cookie
    if not u:  #如果不存在视为没有登录,返回登录页面
        return redirect('/login/')
   
    return render(request,'index.html',{'u':u})

设置cookie的方式很多,默认情况下是关闭浏览器就会失效,选择一种做一下测试就可以。

接下来再来看一下cookie加盐,就是对cookie进行加密,设置一个字符串,把这个字符串和cookie的值进行混合,可以简单参考一下代码:

def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    if request.method=='POST':
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        if not u:
            return render(request,'login.html')
        if u=='root' and p=='123':#登录成功
            res=redirect('/index/')
            #设置cookie,关闭浏览器就会失效
            res.set_cookie('username',u)
            res.set_signed_cookie('username',u,salt='abcdefg') #设置cookie的时候加密
            cok=request.get_signed_cookie('username',u,salt='abcdefg') #在获取的时候需要解密
            print(cok)

            return res
        else:
            return render(request,'login.html')

简单了解一下即可,对cookie加密,在获取的时候就需要解密,两者操作需要一致,不然就会报错。

鳄鱼君在这里整理一种需求,针对用户的选择展示不同文章,文章用数字代替,这里还是拿自定义分页的代码来做修改。在index.html模板中添加一个选择框,让用户可以选择当前页面显示的内容数量,这里需要借助jquery.cookie.jsjquery.main.js来实现,可以自行下载引入。

<select id="a1" onchange="changePage(this)">
    <option value="10">10</option>
    <option value="20">20</option>
    <option value="30">30</option>
</select>
<div>
    {{ page_html  }}
</div>
<script type="text/javascript" src="/static/jquery.min.js"></script>
<script type="text/javascript" src="/static/jquery.cookie.js"></script>
<script>
    /*当页面加载完成,先获取当前显示的内容数量*/
    $(function () {
        var c=$.cookie('per_page_count');  /*获取cookie中的page_count,且只在/indexURL下生效*/
        $('#a1').val(c);
     });
    function changePage(ths) {
        var u=$(ths).val();
        $.cookie('per_page_count',u);  /*拿到当前select选择框的数值,设置到cookie中去*/
        location.reload();
    }
</script>
def index(request):
    u=request.COOKIES.get('username')
    if not u:
        return redirect('/login/')
    cur_page = int(request.GET.get('p', 1))  # 获取的p为字符串,直接转换为int
    val=int(request.COOKIES.get('per_page_count'))  #获取js设置的cookie
    print(val)
    #获取用户选择的值,就可以进行控制,显示对应数量的内容
    return render(request,'index.html',{'u':u})

在index.html页面添加一个选择框,让用户选择当前页面显示的内容数量,用户选择之后,使用js获取并添加到per_page_count的cookie中去,后台获取到它并作出相应的控制,可以自己实现一下,需要注意这里可能存在cookie的污染,你在后台获取到的是一个:%5Bobject%20Object%5D,关闭浏览器或者清楚缓存在做测试。

使用js设置cookie可以添加参数,跟django中cookie的参数一样,互相参照一下就可以了,这里不再过多说明了!

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Django框架基于Cookie实现用户登录、带签名的Cookie》 发布于2020-04-23

分享到:
赞(1) 赏杯咖啡

评论 抢沙发

9 + 3 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册