django cookie session

我们要写一个cmdb被称为运维资源管理系统,BIM流程管理平台,类似这样的项目,很重要的点,就是用户画像,我们来描述参与业务的主体,和之间的关系。在这样的项目当中:用户和权限就显得尤为重要。但是仔细考虑,我们首先要解决的问题不是用户的权限问题,而是用户可持续访问的问题,在学习django之初,各位就听过,http请求是无状态的,前后两次请求没有必然联系,通俗的说:刷新页面,之前请求的内容就没有了。为了保证用户的可持续访问:
前辈们首先研发了cookie(曲奇):通俗的来说cookie就是服务器下发给用户用来校验身份的证明
类似:西游记当中的通关文牒
     
Cookie 核心点
1、    cookie的生成
cookie在django当中使用set_cookie来设置。
        常用参数如下:

max_age

Cookie有效期,生命周期  单位 秒 3600

expires

Cookie 的过期时间和max_age冲突

Path

指定的url访问到cookie

domain

指定域名可以访问cookie

secure

如果为true代表https

cookie的使用
我们在设置和调用cookie的时候,我们有两种方法
1、    普通cookie
2、    加盐cookie
 
Session 
Session的出现是为了弥补cookie的缺陷。cookie解决无连接问题,但是暴露了大量的安全问题,由于是下发用户本地的,所有存在很多问题,比如:
1、    用户拒绝接受cookie
2、    其他盗用,冒用cookie
3、    用户修改cookie
4、    等
由于以上多种问题,我们引入session,我们将用户的信息保存到服务器上,下发给用户cookie当中的只是一个session_id.
        我们来看一下cookie加session的工作原理
1、    用户访问,服务端生成随机字符串
2、    当用户登录成功,把session_id也就是上面生成的随机数组成键值对: 
{session_id:”12asdasdas1i13i123”}
发送给用户
3、    服务器发送之后,用户保存
我们得出结论:
Session(会话)是要依赖cookie,
Session实质上是一种特殊的cookie

django 登录、登出

首先我们先修改我们的登录页面
/template/login.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description" content=""><meta name="author" content=""><title>艾伦沃克尔CMDB-登录</title><!-- Bootstrap Core CSS --><link href="/static/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet"><!-- MetisMenu CSS --><link href="/static/vendor/metisMenu/metisMenu.min.css" rel="stylesheet"><!-- Custom CSS --><link href="/static/dist/css/sb-admin-2.css" rel="stylesheet"><!-- Custom Fonts --><link href="/static/vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css"><!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --><!-- WARNING: Respond.js doesn't work if you view the page via file:// --><!--[if lt IE 9]><script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script><script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script><![endif]--></head><body><div class="container"><div class="row"><div class="col-md-4 col-md-offset-4"><div class="login-panel panel panel-default"><div class="panel-heading"><h3 class="panel-title">欢迎登录艾伦沃克尔CMDB系统</h3></div><div class="panel-body"><form role="form" method="post" action="/login/">{% csrf_token %}<fieldset><div class="form-group"><input class="form-control" placeholder="账号" name="username" type="text" autofocus></div><div class="form-group"><input class="form-control" placeholder="密码" name="password" type="password" value=""></div><div class="checkbox"><label><input name="remember" type="checkbox" value="Remember Me">记住我</label></div><p style="color:red">{{ result.data }}</p><!-- Change this to a button or input when using this as a form -->
{#                                <a href="/index/" class="btn btn-lg btn-success btn-block">登录</a>#}<input class="btn btn-lg btn-success btn-block" type="submit" value="登录"></fieldset></form></div></div></div></div></div><!-- jQuery --><script src="/static/vendor/jquery/jquery.min.js"></script><!-- Bootstrap Core JavaScript --><script src="/static/vendor/bootstrap/js/bootstrap.min.js"></script><!-- Metis Menu Plugin JavaScript --><script src="/static/vendor/metisMenu/metisMenu.min.js"></script><!-- Custom Theme JavaScript --><script src="/static/dist/js/sb-admin-2.js"></script></body></html>

视图函数

\ALLENCMDB\ALLENCMDB\views.py

def login(request):return render_to_response("login.html")

\ALLENCMDB\ALLENCMDB\urls.py

from django.conf.urls import include, url
from django.contrib import adminfrom ALLENCMDB.views import *urlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^ckeditor/',include('ckeditor_uploader.urls')),url(r'^user/', include("User.urls")),url(r'^base/$',base),url(r'^index/$',index),url(r'^login/$',login),
]

cookie的基本使用套路

我们想象的是发送账号和密码请求服务器登录,服务器校验成功下发cookie。实际上,我们请求登录页,就开始下发cookie,我们发送账号和密码请求登录页是带着cookie

普通的设置cookie

\ALLENCMDB\views.py

def login(request):# 生成response实例response = render(request,"login.html")# 设置cookieresponse.set_cookie("login_cookie","helloworld",max_age=3600)return response

加盐cookie设置

def login(request):# 生成response实例response = render(request,"login.html")# 设置加盐cookieresponse.set_cookie("login_cookie","helloworld",salt="nihao",max_age=3600)return response

从上面可以看出,加盐与普通cookie的区别就是加盐cookie在cookie=”helloworld”后面多了一串不规则的字符串

获取普通的cookie

login_cookie = request.COOKIES.get("login_cookie")

取出加盐的cookie

login_cookie = request.get_signed_cookie(key = "valid",salt = "nihao")

登录视图函数代码

\ALLENCMDB\views.py

def login(request):if request.method == "POST" and request.POST:#获取校验cookielogin_cookie = request.get_signed_cookie(key="valid",salt="nihao")if login_cookie:data = request.POSTusername = data.get("username")password = data.get("password")try:user = CMDBUser.objects.get(username=username)except:return HttpResponse("用户名不存在")else:db_password = user.passwordif password == db_password:response = HttpResponseRedirect("/index/",locals())response.set_cookie(key="valid",value=user.username)return responseelse:return HttpResponse("密码错误")else:return HttpResponse("404,你访问的页面不存在")else:# 生成response实例response = render(request,"login.html")# 设置cookie# response.set_cookie("valid","login_cookie",max_age=3600)# 设置加盐cookieresponse.set_signed_cookie("valid","login_cookie",salt="nihao",max_age=3600)return response

上面的登录是没有问题的,但是我们不通过登录,直接访问index也可以,也就是说我们安装大门,没有砌墙。所有用户在访问index之前,需要被校验,校验是否具有cookie,这个校验使用的地方太多。所以我们用装饰器来写校验。

装饰器视图函数

\ALLENCMDB\views.py

def loginValid(func):def valid(request,*args,**kwargs):username = request.COOKIES.get("valid")if username:try:user = CMDBUser.objects.get(username=username)except:return HttpResponseRedirect("/login/",locals())else:return func(request)else:return HttpResponseRedirect("/login/",locals())return valid@loginValid
def index(request):return render(request,'index.html')

除了上述所说的登录需要cookie的校验,当然我们工作当中还需要在我们登出时,需要将我们的cookie进行删除,跳转到我们的登录界面

def logout(request):valid = request.COOKIES.get("valid")response = HttpResponseRedirect("/login/")if valid == "login_cookie":response.delete_cookie("valid")return response

当我们在点击注销登录时,会自动删除我们的cookie值,并且再次访问我们的页面时会自动跳转到登录页面。

以上还有一个可以优化的地方就是,用户密码在进行入库时可以利用md5算法进行加密后再入库,这样数据库中也是加密后的密码。

CMDB开发之用户登录登出的cookie校验相关推荐

  1. [django项目] 实现用户登录登出功能

    用户登录登出功能 I. 功能需求分析 1>功能分析 1.1>流程图 1.2>功能接口 登录页面 登录功能 退出功能 II. 登陆页面 1>接口设计 1.1>接口说明 类目 ...

  2. python用户名密码登录退出_用户登录登出

    一.功能需求分析 1.登录功能分析 1.1登录流程 1.2功能(一个请求为一个功能) -登录页面 -登录功能 -登出功能 二.登录页面 1.接口设计 1.1.接口说明 类目 说明 请求方式 GET u ...

  3. kingScada用户登录登出与用户显示 操作权限设置

    1. 添加按钮用于用户登录,登出,文本用于显示当前登录的用户 2. 登录函数 logon() 3. 登出函数logoff() 4. 当前用户显示 关联工程中自带的User 字符串型变量 5. 添加用户 ...

  4. open**N获取用户登录登出信息

    安装和配置VPN不在详细说明问度娘即可. 创建存储用户登陆日志的数据库 sqlite3 /etc/openvpn/openvpn.db SQLite version 3.6.20 Enter &quo ...

  5. SpringBoot登录登出切面开发

    阅读本文约"2.5分钟" 本文开发环境是SpringBoot2.X版本. 对于系统而言(这里多指管理系统或部分具备登录登出功能的系统),登录登出是一个类权限验证的过程,现在一般是以 ...

  6. SSM项目图书馆管理系统,适合新人练手和毕设参考,功能首页展示 系统注册登录登出 用户管理 权限控制管理 书籍管理 图书借阅管理 个人借阅记录管理 书籍详细信息展示等

    图书馆管理系统,系统采用B/S架构 系统采用框架:java+maven+stringboot+mybatis+mysql-plus+boostart(前端界面) 首页展示 内容后台管理 菜单权限管理 ...

  7. php 登录 登出,个人博客—用户登陆登出

    个人博客-用户登陆&登出 点击头部的登陆按钮,弹出用户登录dialog 用户登录dialog 输入用户名和密码会验证是否符合要求,不符合则在上面提示错误信息,且将对应的表单元素边框和必填标志变 ...

  8. java php 单点登陆,cas实现单点登录,登出(java跟php客户端)(转)

    cas实现单点登录,登出(java跟php客户端)(转)cas实现单点登录,登出(java和php客户端) (转) 最近项目中需要做单点登录,客户端包含java和php,java有几个应用程序,php ...

  9. linux 执行程序 注销,Linux登录登出的过程 | Soo Smart!

    最近一直遇到crontab执行脚本和手动执行结果不一样的问题.根据添加的echo语句已经确定crontab能够准时执行任务,可是脚本里的程序不能正确执行.唯一能确定的是环境变量问题,可是即使明确地写上 ...

最新文章

  1. [JS]请填充代码,使mySort()能使传入的参数按照从小到大的顺序显示出来。
  2. linux 内核中基于netfilter的编译选项
  3. myeclipse 10安装svn插件
  4. LDAP 中 CN, OU, DC 的含义
  5. 数据工程师在未来将扮演不可或缺的角色
  6. 全国计算机等级考试题库二级C操作题100套(第16套)
  7. UI超实用通用图标素材模板
  8. html div 右侧,span在div里居左和居右布局
  9. 开发者论坛一周精粹(第六十三期) WHM自动脚本修复ssh问题
  10. 同名文件替换怎么恢复_U盘里被替换的文件怎么恢复?方法选对,其实很简单...
  11. 如何在5分钟内发现 SQL 语言中的数据血缘
  12. cs231n课后作业(1)
  13. 简易看房加权评估案例C++
  14. 【LaTeX】LaTeX常见括号总结
  15. Azure实现虚拟机的自动开关机
  16. Excel入门之快速录入数据
  17. python3使用staf问题_转载—越来越强大的SAFS/STAF/STAX自动化测试框架
  18. 安卓学习 Day26:使用自定义视图绘制文本、图像与图形
  19. 专访阿里云游戏首席架构师李刚:如何解决云服务技术两大痛点?
  20. 学习金字塔---优化你的学习方法

热门文章

  1. 微信小程序实现锚点跳转
  2. 20210212web04mysql多表,事务
  3. 2019零基础学Android第0课——零基础怎么学Android?
  4. 《ASP.NET AJAX 应用剖析立即上手》简体版即将上市!
  5. 提交工程到git的分支上
  6. 几款好用的Markdown 写作工具推荐(上)
  7. layer打开iframe弹层,传递与接收参数
  8. 用Spring Boot开发API请求详解--API开发
  9. css字太多了省略_列表中文字太多 溢出使用省略号css方法
  10. 华师的入学计算机测试题,华师期末考试计算机练习题