登陆验证

  因为http协议是无状态协议,但是我们有时候需要这个状态,这个状态就是标识

  前端提交from表单,后端获取对应输入值,与数据库对比,由此对象设置一个标识,该对象

在别的视图的时候,有此标识,可以访问,没有则让其去登陆

  所以,cookie,session应运而生

一,cookie验证流程

 cookie
客户端(浏览器)第一次请求登陆页面的时候,携带的cookie是空,响应页面也没有给cookie设置
提交form 表单的时候,携带的cookie是空,服务器去判断,有这个用户,设置了cookie
跳转到首页携带了cookie
删除cokkie
response.delete_cookie("cookie_key",path="/",domain=name)

设置cookie

 login 函数视图
user=UserInfo.objects.filter(username=user,password=pwd).first() if user:
obj=redirect("/index/")
obj.set_cookie("is_login",True,path='/',max_age=10,expires=10)
# cookie 参数
# def set_cookie(self, key, 键
#           value = '', 值
#              max_age = None, 超长时间
#              expires = None, 超长时间
#              path = '/', Cookie生效的路径,
# 浏览器只会把cookie回传给带有该路径的页面,这样可以避免将
# cookie传给站点中的其他的应用。
# / 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
obj.set_cookie("username",user.username)
return obj index 函数视图
ret=request.COOKIES.get('is_login')
if ret:
return render(request,"index.html")
return redirect("/login/")

二,cookie+session验证流程

 cookie + session
与cookie 相同
只是cookie保存的是 session_id:随机字符串 客户端
随机字符串,data 以键值对方式保存在 django_session里面 服务器
跳转首页去跟服务器django_session去拿值
删除 session
可以删除 del request.session['is_login'] 这也只是在django_session里面的data里面删除这个键值对
还可以 这样 request.session.flush() 这样是删除django_sesssion里面的一条记录

设置session

 login 函数视图
user=UserInfo.objects.filter(username=user,password=pwd).first() if user:
# 注意这里设置 session
request.session["Is_login"]=True
return redirect("/index/") index 函数视图
ret=request.session.get('is_login')
if ret:
return render(request,"index.html")
return redirect("/login/")

三,auth验证流程

 auth
与cookie 相同
随机字符串,data 以键值对方式保存在 django_session里面 客户端
跳转首页去跟服务器django_session去拿值 服务器
auth 模块有自己的验证机制,通过
auth.authenticate(username=user,password=pwd) 匹配验证
auth.login(request,user) 设置session
request.is_authenticated() 是否通过验证,返回true,false
auth.logout(request) 删除django_session一条记录

auth验证  ,httprequest.user

 HttpRequest.user

   一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。

   如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。

     例如:

     if request.user.is_authenticated():
# Do something for logged-in users.
else:
# Do something for anonymous users. user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。

auth验证 实际例子(登陆,注册,更改密码)

注意,from表单里面不应该有button按钮,会当成数据提交

 from django.contrib.auth.models import User
from django.contrib import auth
def login(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
# django 利用自身auth_user表验证,去表里匹配
user=auth.authenticate(username=user,password=pwd)
if user:
# 验证通过,会记录在 djangos_session 表里面一条记录 给某个已认证的用户附加上session id
auth.login(request,user) # 设置session cookie记录 session_id:随机字符串 django_session 随机字符串:session_data
return redirect("/index/") return render(request, "login.html") def index(request):
user=request.user # 显示当前登录用户对象 if not user.is_authenticated(): # 是否通过验证
return redirect("/login/") name=request.user.username
return render(request,"index.html",{"name":name}) def log_out(request):
'''
注销
:param request:
:return:
'''
auth.logout(request) # request.session.flush()
return redirect("/login/") def reg(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd") user=User.objects.create_user(username=user,password=pwd) # 创建用户信息
return redirect("/login/") return render(request,"reg.html") def setpwd(request):
'''
更改 密码 ###########
:param request:
:return:
'''
if request.method == "POST":
user = request.POST.get("user")
pre_pwd = request.POST.get("pre_pwd")
new_pwd = request.POST.get("new_pwd")
repeat_pwd = request.POST.get("repeat_pwd")
# 没有判断输入新密码2次是否一样
user=auth.authenticate(username=user,password=pre_pwd)
# 更改密码 #############################
if user:
user.set_password(new_pwd)
user.save()
return redirect("/login/") return render(request,"setpwd.html")

登陆验证系统实例-三种(cookie,session,auth)的更多相关文章

  1. ZYNQ入门实例——三种GPIO应用、中断系统及软硬件交叉触发调试

    一.前言 Xlinx的ZYNQ系列SOC集成了APU.各种专用外设资源和传统的FPGA逻辑,为ARM+FPGA的应用提供助力,降低功耗和硬件设计难度的同时极大提高两者间传输的带宽.之前在研究生课题中使 ...

  2. Android系统的三种分屏显示模式

    Google在Android 7.0中引入了一个新特性——多窗口支持,允许用户一次在屏幕上打开两个应用.在手持设备上,两个应用可以在"分屏"模式中左右并排或上下并排显示.在电视设备 ...

  3. linux系统的三种网络连接模式

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...

  4. CBV装饰校验的三种方式session

    代码如下: from django.shortcuts import render,HttpResponse,redirect from django.views import View # Crea ...

  5. 概念与用法-cookie,session,auth (认证系统)

    COOKIE 与 SESSION 概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie ...

  6. Django 认证系统 cookie & session & auth模块

    概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原理是:由服务器产生内容,浏 ...

  7. java获得当前系统时间三种方法

    参见: http://blog.csdn.net/cloume/article/details/46624637

  8. redhat系统下三种主要的软件包安装方法

    1. 通过RPM软件包来安装 RPM(Redhat Package Management)标准的软件包,只需简单地输入命令“rpm -ivh filename.rpm”即可: 如果需要对已经安装的RP ...

  9. django cookie,session,auth

    一.最完美的auth auth_user 是用来存储的用户注册的username,password auth 首先需要引入模块 from django.contrib import auth 用户认证 ...

随机推荐

  1. LeetCode第[55]题(Java):Jump Game

    题目:跳跳游戏 难度:Medium 题目内容: Given an array of non-negative integers, you are initially positioned at the ...

  2. 编写程序时候莫名出现<property name="dialect">org.hibernate.dialect.FirebirdDialect</property>

    把<propertyname="dialect">org.hibernate.dialect.FirebirdDialect</property> 语句去掉 ...

  3. static-静态类型

    1.基本概念 好像没什么概念. 2.作用 主要是两个:隐藏和保持值 01.隐藏 当在一个文件中定义了一个static全局变量,则该变量对该文件是可见的,对其他的文件不可见,也就减少了变量冲突的问题. ...

  4. ARM的异常处理方式

    1.什么是异常? 正常工作之外的流程都叫异常 异常会打断正在执行的工作,并且一般我们希望异常处理完成后继续回来执行原来的工作 中断是异常的一种 2.异常向量表 所有的CPU都有异常向量表,这是CPU设 ...

  5. 四则运算生成与校检 Python实现

    GitHub地址 https://github.com/little-petrol/Arithmetic.git 合作者: 郭旭 和 卢明凯 设计实现过程 代码的组织主要分为两个部分: 算法与结构体的 ...

  6. HTTPPost/AFNetWorking/JSONModel/NSPredicate

    一.HTTPPost================================================ 1. POST方式发送请求 HTTP协议下默认数据发送请求方法是GET方式,若需要 ...

  7. Git的origin和master分析

    首先要明确一点,对git的操作是围绕3个大的步骤来展开的(其实几乎所有的SCM都是这样) 1. 从git取数据(git clone) 2. 改动代码 3. 将改动传回git(git push) 这3个 ...

  8. c++指针初探

    业余时间准备重温一下c++,因为在阅读Android源码到native层的时候感觉有点吃力,只是在大学时候很不用心的学过c++,所以重温下以便打好一些编程基础知识,本篇就很简单的对c++的指针做初步的 ...

  9. => 应用在js回调函数中

    => 可以简化以前的回调函数的调用,具体来说: 今后,几乎所有的回调函数都可用箭头函数简化 比如: 1. 所有回调函数都可: 去function改=> 2. 如果函数体只有一句话: 可省略 ...

  10. for-in和for 循环 的区别

    以前早就知道,for...in 语句用于对数组或者对象的属性进行循环操作,而for循环是对数组的元素进行循环,而不能引用于非数组对象, 但咱在js项目里,遇到循环,不管是数组还是对象,经常使用for- ...