您的位置: 翼速应用 > 业内知识 > web前端 > 正文

解析Django Session与Cookie分别实现用户登录记录状态

简介

由于http协议的请求是无状态的。故为了让用户在浏览器中再次访问该服务端时,他的登录状态能够保留(也可翻译为该用户访问这个服务端其他网页时不需再重复进行用户认证)。我们可以采用Cookie或Session这两种方式来让浏览器记住用户。

Cookie与Session说明与实现

Cookie


说明

Cookie是一段小信息(数据格式一般是类似key-value的键值对),由服务器生成,并发送给浏览器让浏览器保存(保存时间由服务端定夺)。当浏览器下次访问该服务端时,会将它保存的Cookie再发给服务器,从而让服务器根据Cookie知道是哪个浏览器或用户在访问它。(由于浏览器遵从的协议,它不会把该服务器的Cookie发送给另一个不同host的服务器)。

Django中实现Cookie

  1. from django.shortcuts import render, redirect  
  2.   
  3. # 设置cookie  
  4. """  
  5. key: cookie的名字  
  6. value: cookie对应的值  
  7. max_age: cookie过期的时间  
  8. """  
  9. response.set_cookie(key, value, max_age)  
  10. # 为了安全,有时候我们会调用下面的函数来给cookie加盐  
  11. response.set_signed_cookie(key,value,salt='加密盐',...)  
  12.   
  13. # 获取cookie   
  14. request.COOKIES.get(key)  
  15. request.get_signed_cookie(key, salt="加密盐"default=None)  
  16.   
  17. # 删除cookie  
  18. reponse.delete_cookie(key)  


下面就是具体的代码实现了views.py


  1. # 编写装饰器检查用户是否登录  
  2. def check_login(func):  
  3.  def inner(request, *args, **kwargs):  
  4.   next_url = request.get_full_path()  
  5.   # 假设设置的cookie的key为login,value为yes  
  6.   if request.get_signed_cookie("login", salt="SSS"default=None) == 'yes':  
  7.    # 已经登录的用户,则放行  
  8.    return func(request, *args, **kwargs)  
  9.   else:  
  10.    # 没有登录的用户,跳转到登录页面  
  11.    return redirect(f"/login?next={next_url}")  
  12.  return inner  
  13.   
  14. # 编写用户登录页面的控制函数  
  15. @csrf_exempt  
  16. def login(request):  
  17.  if request.method == "POST":  
  18.   username = request.POST.get("username")  
  19.   passwd = request.POST.get("password")  
  20.   next_url = request.POST.get("next_url")  
  21.   
  22.   # 对用户进行验证,假设用户名为:aaa, 密码为123  
  23.   if username === 'aaa' and passwd == '123':  
  24.    # 执行其他逻辑操作,例如保存用户信息到数据库等  
  25.    # print(f'next_url={next_url}')  
  26.    # 登录成功后跳转,否则直接回到主页面  
  27.    if next_url and next_url != "/logout/":  
  28.     response = redirect(next_url)  
  29.    else:  
  30.     response = redirect("/index/")  
  31.    # 若登录成功,则设置cookie,加盐值可自己定义取,这里定义12小时后cookie过期  
  32.    response.set_signed_cookie("login"'yes', salt="SSS", max_age=60*60*12)  
  33.    return response  
  34.   else:  
  35.    # 登录失败,则返回失败提示到登录页面  
  36.    error_msg = '登录验证失败,请重新尝试'  
  37.    return render(request, "app/login.html", {  
  38.     'login_error_msg': error_msg,  
  39.     'next_url': next_url,  
  40.    })  
  41.  # 用户刚进入登录页面时,获取到跳转链接,并保存  
  42.  next_url = request.GET.get("next"'')  
  43.  return render(request, "app/login.html", {  
  44.   'next_url': next_url  
  45.  })  
  46.   
  47. # 登出页面  
  48. def logout(request):  
  49.  rep = redirect("/login/")  
  50.  # 删除用户浏览器上之前设置的cookie  
  51.  rep.delete_cookie('login')  
  52.  return rep  
  53.   
  54. # 给主页添加登录权限认证  
  55. @check_login  
  56. def index(request):  
  57.  return render(request, "app/index.html")  

由上面看出,其实就是在第一次用户登录成功时,设置cookie,用户访问其他页面时进行cookie验证,用户登出时删除cookie。另外附上前端的login.html部分代码


  1. <form action="{% url 'login' %}" method="post">  
  2.     <h1>请使xx账户登录</h1>  
  3.     <div>  
  4.     <input id="user" type="text" class="form-control" name="username" placeholder="账户" required="" />  
  5.     </div>  
  6.     <div>  
  7.     <input id="pwd" type="password" class="form-control" name="password" placeholder="密码" required="" />  
  8.     </div>  
  9.     <div style="display: none;">  
  10.      <input id="next" type="text" name="next_url" value="{{ next_url }}" />  
  11.     </div>  
  12.     {% if login_error_msg %}  
  13.      <div id="error-msg">  
  14.       <span style="color: rgba(255,53,49,0.8); font-family: cursive;">{{ login_error_msg }}</span>  
  15.      </div>  
  16.     {% endif %}  
  17.     <div>  
  18.      <button type="submit" class="btn btn-default" style="float: initial; margin-left: 0px">登录</button>  
  19.     </div>  
  20.    </form>  


Session

Session说明

Session则是为了保证用户信息的安全,将这些信息保存到服务端进行验证的一种方式。但它却依赖于cookie。具体的过程是:服务端给每个客户端(即浏览器)设置一个cookie(从上面的cookie我们知道,cookie是一种”key, value“形式的数据,这个cookie的value是服务端随机生成的一段但唯一的值)。

当客户端下次访问该服务端时,它将cookie传递给服务端,服务端得到cookie,根据该cookie的value去服务端的Session数据库中找到该value对应的用户信息。(Django中在应用的setting.py中配置Session数据库)。

根据以上描述,我们知道Session把用户的敏感信息都保存到了服务端数据库中,这样具有较高的安全性。

Django中Session的实现


  1. # 设置session数据, key是字符串,value可以是任何值  
  2. request.session[key] =&

我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题