Django Session和Cookie分别实现记住用户登录状态操作

简介

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

Cookie与Session说明与实现

Cookie

说明

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

Django中实现Cookie

from django.shortcuts import render, redirect

# 设置cookie
"""
key: cookie的名字
value: cookie对应的值
max_age: cookie过期的时间
"""
response.set_cookie(key, value, max_age)
# 为了安全,有时候我们会调用下面的函数来给cookie加盐
response.set_signed_cookie(key,value,salt='加密盐',...)

# 获取cookie
request.COOKIES.get(key)
request.get_signed_cookie(key, salt="加密盐", default=None)

# 删除cookie
reponse.delete_cookie(key)

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

views.py

# 编写装饰器检查用户是否登录
def check_login(func):
 def inner(request, *args, **kwargs):
 next_url = request.get_full_path()
 # 假设设置的cookie的key为login,value为yes
 if request.get_signed_cookie("login", salt="SSS", default=None) == 'yes':
  # 已经登录的用户,则放行
  return func(request, *args, **kwargs)
 else:
  # 没有登录的用户,跳转到登录页面
  return redirect(f"/login?next={next_url}")
 return inner

# 编写用户登录页面的控制函数
@csrf_exempt
def login(request):
 if request.method == "POST":
 username = request.POST.get("username")
 passwd = request.POST.get("password")
 next_url = request.POST.get("next_url")

 # 对用户进行验证,假设用户名为:aaa, 密码为123
 if username === 'aaa' and passwd == '123':
  # 执行其他逻辑操作,例如保存用户信息到数据库等
  # print(f'next_url={next_url}')
  # 登录成功后跳转,否则直接回到主页面
  if next_url and next_url != "/logout/":
  response = redirect(next_url)
  else:
  response = redirect("/index/")
  # 若登录成功,则设置cookie,加盐值可自己定义取,这里定义12小时后cookie过期
  response.set_signed_cookie("login", 'yes', salt="SSS", max_age=60*60*12)
  return response
 else:
  # 登录失败,则返回失败提示到登录页面
  error_msg = '登录验证失败,请重新尝试'
  return render(request, "app/login.html", {
  'login_error_msg': error_msg,
  'next_url': next_url,
  })
 # 用户刚进入登录页面时,获取到跳转链接,并保存
 next_url = request.GET.get("next", '')
 return render(request, "app/login.html", {
 'next_url': next_url
 })

# 登出页面
def logout(request):
 rep = redirect("/login/")
 # 删除用户浏览器上之前设置的cookie
 rep.delete_cookie('login')
 return rep

# 给主页添加登录权限认证
@check_login
def index(request):
 return render(request, "app/index.html")

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

<form action="{% url 'login' %}" method="post">
  <h1>请使xx账户登录</h1>
  <div>
  <input id="user" type="text" class="form-control" name="username" placeholder="账户" required="" />
  </div>
  <div>
  <input id="pwd" type="password" class="form-control" name="password" placeholder="密码" required="" />
  </div>
  <div style="display: none;">
   <input id="next" type="text" name="next_url" value="{{ next_url }}" />
  </div>
  {% if login_error_msg %}
   <div id="error-msg">
   <span style="color: rgba(255,53,49,0.8); font-family: cursive;">{{ login_error_msg }}</span>
   </div>
  {% endif %}
  <div>
   <button type="submit" class="btn btn-default" style="float: initial; margin-left: 0px">登录</button>
  </div>
  </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的实现

# 设置session数据, key是字符串,value可以是任何值
request.session[key] = value
# 获取 session
request.session.get[key]
# 删除 session中的某个数据
del request.session[key]
# 清空session中的所有数据
request.session.delete()

下面就是具体的代码实现了:

首先就是设置保存session的数据库了。这个在setting.py中配置:(注意我这里数据库用的mongodb,并使用了django_mongoengine库;关于这个配置请根据自己使用的数据库进行选择,具体配置可参考官方教程)

SESSION_ENGINE = 'django_mongoengine.sessions'

SESSION_SERIALIZER = 'django_mongoengine.sessions.BSONSerializer'

views.py

# 编写装饰器检查用户是否登录
def check_login(func):
 def inner(request, *args, **kwargs):
 next_url = request.get_full_path()
 # 获取session判断用户是否已登录
 if request.session.get('is_login'):
  # 已经登录的用户...
  return func(request, *args, **kwargs)
 else:
  # 没有登录的用户,跳转刚到登录页面
  return redirect(f"/login?next={next_url}")
 return inner

@csrf_exempt
def login(request):
 if request.method == "POST":
 username = request.POST.get("username")
 passwd = request.POST.get("password")
 next_url = request.POST.get("next_url")
 # 若是有记住密码功能
 # remember_sign = request.POST.get("check_remember")
 # print(remember_sign)

 # 对用户进行验证
 if username == 'aaa' and passwd == '123':
  # 进行逻辑处理,比如保存用户与密码到数据库

  # 若要使用记住密码功能,可保存用户名、密码到session
  # request.session['user_info'] = {
  # 'username': username,
  # 'password': passwd
  # }
  request.session['is_login'] = True
  # 判断是否勾选了记住密码的复选框
  # if remember_sign == 'on':
  # request.session['is_remember'] = True
  # else:
  # request.session['is_remember'] = False

  # print(f'next_url={next_url}')
  if next_url and next_url != "/logout/":
  response = redirect(next_url)
  else:
  response = redirect("/index/")
  return response
 else:
  error_msg = '登录验证失败,请重新尝试'
  return render(request, "app/login.html", {
  'login_error_msg': error_msg,
  'next_url': next_url,
  })
 next_url = request.GET.get("next", '')
 # 检查是否勾选了记住密码功能
 # password, check_value = '', ''
 # user_session = request.session.get('user_info', {})
 # username = user_session.get('username', '')
 # print(user_session)
 #if request.session.get('is_remember'):
 # password = user_session.get('password', '')
 # check_value = 'checked'
 # print(username, password)
 return render(request, "app/login.html", {
 'next_url': next_url,
 # 'user': username,
 # 'password': password,
 # 'check_value': check_value
 })

def logout(request):
 rep = redirect("/login/")
 # request.session.delete()
 # 登出,则删除掉session中的某条数据
 if 'is_login' in request.session:
 del request.session['is_login']
 return rep

@check_login
def index(request):
 return render(request, "autotest/index.html")

另附login.html部分代码:

  <form action="{% url 'login' %}" method="post">
  <h1>请使xxx账户登录</h1>
  <div>
  <input id="user" type="text" class="form-control" name="username" placeholder="用户" required="" value="{{ user }}" />
  </div>
  <div>
  <input id="pwd" type="password" class="form-control" name="password" placeholder="密码" required="" value="{{ password }}" />
  </div>
  <div style="display: none;">
   <input id="next" type="text" name="next_url" value="{{ next_url }}" />
  </div>
  {% if login_error_msg %}
   <div id="error-msg">
   <span style="color: rgba(255,53,49,0.8); font-family: cursive;">{{ login_error_msg }}</span>
   </div>
  {% endif %}
  // 若设置了记住密码功能
  // <div style="float: left">
  // <input id="rmb-me" type="checkbox" name="check_remember" {{ check_value }}/>记住密码
  // </div>
  <div>
   <button type="submit" class="btn btn-default" style="float: initial; margin-right: 60px">登录</button>
  </div>
  </form>

总的来看,session也是利用了cookie,通过cookie生成的value的唯一性,从而在后端数据库session表中找到这value对应的数据。session的用法可以保存更多的用户信息,并使这些信息不易被暴露。

总结

session和cookie都能实现记住用户登录状态的功能,如果为了安全起见,还是使用session更合适

以上这篇Django Session和Cookie分别实现记住用户登录状态操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • django进阶之cookie和session的使用示例

    Cookies :是浏览器为 Web 服务器存储的一小段信息. 每次浏览器从某个服务器请求页面时,它收到服务器回发送过来的cookies.它保存在浏览器下的某个文件夹下. Session:Django的Session机制会向请求的浏览器发送cookie字符串.同时也会保存到本地一份,用来验证浏览器登录是否为同一用户.它存在于服务器,Django默认会把session存入到数据库中. Session依赖于Cookie,如果浏览器不能保存cookies那么session就失效了.因为它需要浏览器的c

  • Django中的cookie和session

    http协议是无状态的.下一次去访问一个页面时并不知道上一次对这个页面做了什么. 无状态的应用层面的原因是:浏览器和服务器之间的通信都遵守HTTP协议. 根本原因是:浏览器与服务器是使用Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的Socket连接,而且服务器也会在处理页面完毕之后销毁页面对象. 有时需要保存下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等. 实现状态保持主要有两种方式: 在客户端存储信息使用Cookie.在服务器端存储信息使用Session

  • django session完成状态保持的方法

    本例使用登录页面演示,session的状态保持功能. 说明:因为http是无状态的,客户端请求一次页面后,就结束了,当再次访问时,服务器端并不知道浏览器此访问过什么.所以这样就需要状态保持功能,状态保存有两种方式:session和cookie都能实现状态保持. 状态保持 http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态 客户端与服务器端的一次通信,就是一次会话 实现状态保持的方式:在客户端或服务器端存储与会话有关的数据 存储方式包括cookie.session,会话一般指

  • Django Session和Cookie分别实现记住用户登录状态操作

    简介 由于http协议的请求是无状态的.故为了让用户在浏览器中再次访问该服务端时,他的登录状态能够保留(也可翻译为该用户访问这个服务端其他网页时不需再重复进行用户认证).我们可以采用Cookie或Session这两种方式来让浏览器记住用户. Cookie与Session说明与实现 Cookie 说明 Cookie是一段小信息(数据格式一般是类似key-value的键值对),由服务器生成,并发送给浏览器让浏览器保存(保存时间由服务端定夺).当浏览器下次访问该服务端时,会将它保存的Cookie再发给

  • PHP根据session与cookie用户登录状态操作类的代码

     1.用户登录状态操作类UserLogin <?php final class UserLogin { public function __construct() { } public static function getUserInfo() { if (isset($_COOKIE["user_id"])&&$_COOKIE["user_id"]&&(trim($_COOKIE["user_id"])!=

  • spring aop action中验证用户登录状态的实例代码

    最近在学习ssh框架时,照着网上做了一个商城系统,之前在一些需要用户存在的操作中,都是在每一个action中写重复的代码,这样做现在想起来并不好,想起了spring的aop,于是想通过aop来给每个需要用户操作的Action验证用户登录状态. 想法是这样的: 1. 用户登录时把userId放入session中 2. 通过spring 写一个advice来获取session中的userId,判断用户登录状态,如果userId不符合,则抛出自定义异常 3. 通过struts中配置来捕获异常,跳转界面

  • Asp.Net MVC记住用户登录信息下次直接登录功能

    有的时候做网站,就需要记住用户登录信息,下次再登录网站时,不用重复输入用户名和密码,原理是浏览器的cookie把状态给记住了! 那么具体是怎么实现的呢?下面博主将一部分代码贴出来,想要完整版的Demo可以到百度云和码云下载, 百度云下载链接:https://pan.baidu.com/s/19pL-koHI9UnVd4bK3Fpuyg 密码: nud3 马云下载链接:https://gitee.com/WuFengZui/RememberLoginDemo      [没有下载链接的都是耍流氓 

  • Vue保持用户登录状态(各种token存储方式)

    目录 怎么设置Cookie Cookie的缺点: LocalStorage与SessionStorage存储Token LocalStorage与SessionStorage的主要区别: Vuex存储Token 为什么要使用Vuex 在前端中,实现保持用户登录状态的方法有很多种,你通过可以存Cookie.Session.Token等信息来保持,不管后台向前端发送哪个我们要做的就是将这些信息存在在本地浏览器中,浏览器再次发送请求时,将设置了'键'='值'的Cookie再次抛给服务器,服务器通过Co

  • django 装饰器 检测登录状态操作

    1.检测登录状态 base.py def checkLogin(func): """ 查看session值用来判断用户是否已经登录 :param func: :return: """ def warpper(request,*args,**kwargs): if request.session.get('username', False): return func(request, *args, **kwargs) else: return Ht

  • Go WEB框架使用拦截器验证用户登录状态实现

    目录 wego拦截器 main函数 登录逻辑 登录拦截器的实现 index页面的实现 wego拦截器 wego拦截器是一个action(处理器函数)之前或之后被调用的函数,通常用于处理一些公共逻辑.拦截器能够用于以下常见问题: 请求日志记录 错误处理 身份验证处理 wego中有以下拦截器: before_exec :执行action之前拦截器 after_exec :执行action之后拦截器 本文用一个例子来说明如何使用拦截器来实现用户登录状态的判定.在这个例子中,用户访问login_get来

  • 详解小程序用户登录状态检查与更新实例

    这篇文章主要解决以下问题:用户每次登录小程序(包括第一次使用)及点击小程序的每个页面的时候,我们如何判断他当前的登录状态是否过期?如果过期,如何重新获取用户信息并发送至开发者服务器更新用户信息,以及设置新的用户登录状态? 将这个部分单独作为一篇文章有两个原因: ① wx.getUserInfo(OBJECT) 接口调整,废弃了以前直接获取用户信息的方法: ② 上篇文章授权.登录.session_key.unionId只梳理了登录流程而没有贴实际的代码,所以这篇文章以代码实现为主. 1. 代码逻辑

  • Vue项目如何保持用户登录状态(localStorage+vuex刷新页面后状态依然保持)

    目录 前言 一.实现效果 二.实现步骤及涉及要点 三.涉及代码 总结 前言 在前端项目开发中,实现用户的登陆注册功能时常常会有一个问题,那就是我们设置的登录状态,在浏览器页面刷新后就消失了,这其实只是因为我们没有保存用户状态. 这里小马演示使用的是 localStorage + vuex 方法(其他诸如 sessionStorage.cookie 等用法相同,只是功能有所区别). 一.实现效果 实现功能:用户登录成功后,刷新浏览器页面或者关闭浏览器再次打开网页后,登录状态依然保持,直到用户点击登

  • jQuery基于ajax实现页面加载后检查用户登录状态的方法

    本文实例讲述了jQuery基于ajax实现页面加载后检查用户登录状态的方法.分享给大家供大家参考,具体如下: 拥有会员功能的网站,如果会员已经登录,那么要显示相应的登录状态,而且这种显示的需求是在网站的每个页面都有的(目前国内网站貌似都是这么做的,还没有见过其他形式的状态显示方式),这样,在打开一个新的页面时就要知道这个会员是否已经登录,需要判断登录的状态. 1.解决方案. 为了能够实现在每一个页面判断会员登录状态的功能,我采用了页面时通过ajax传递参数通过后端返回的登录状态结果进行判断,当然

随机推荐