登陆验证

  因为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. django Models 常用的字段和参数

    1.字段 CharField IntegerField floatField DateTimeField DateField DecimalField 2.参数 null default choice ...

  2. Ajax基础(五)--封装库

    jQuery ajax请求的基本语法: 一.封装为对象: ajax.txt代码: {"id":"102","username":" ...

  3. 51nod-1385-贪心-构造

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1385 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 ...

  4. PhantomJS 和Selenium模拟页面js点击

    由于自己不怎么会javascripts,无法找全所有的参数进行模拟提交,所以只能寻求Selenium和PhantpmJS的方式. 先说下ubuntu上怎么安装相应的环境,尤其PhantomJS安装比较 ...

  5. ./startup.sh: /bin/sh^M: bad interpreter: 没有那个文件或目录 解决办法

    这是因为Linux上 的catalina.sh文件格式给修改了,看不出来,这样就必须通过vim编辑下,变为正常的格式,在catalina.sh的命令模式下输入  ( :set ff=unix ),接着 ...

  6. [置顶] 【Android实战】----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的

    一.简介 接上一篇[Android实战]----基于Retrofit实现多图片/文件.图文上传中曾说非常想搞明白为什么Retrofit那么屌.最近也看了一些其源码分析的文章以及亲自查看了源码,发现其对 ...

  7. Wordpress在主题或者插件中自定义存储附件的方法

    1.前端使用form表单 //单文件上传,我的业务需求中限制了必须上传图片 <input type="file" name="singlename" ac ...

  8. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space(Java堆空间内存溢出)解决方法

    http://hi.baidu.com/619195553dream/blog/item/be9f12adc1b5a3e71f17a2e9.html问题描述Exception in thread &q ...

  9. 服务器与客户端数据交互 (json)

    服务器返回到客户端json对象,是什么类型,而用ajax处理后,变成什么了.   > 猜测1:服务器返回的数据带双引号: "返回值",理由:因为返回的类型都是字符串. 结果无 ...

  10. Lua编程

    lua编程大杂烩.博客其他方面也不错.先记录.http://www.cnblogs.com/stephen-liu74/category/360139.html