登陆验证系统实例-三种(cookie,session,auth)
登陆验证
因为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)的更多相关文章
- ZYNQ入门实例——三种GPIO应用、中断系统及软硬件交叉触发调试
一.前言 Xlinx的ZYNQ系列SOC集成了APU.各种专用外设资源和传统的FPGA逻辑,为ARM+FPGA的应用提供助力,降低功耗和硬件设计难度的同时极大提高两者间传输的带宽.之前在研究生课题中使 ...
- Android系统的三种分屏显示模式
Google在Android 7.0中引入了一个新特性——多窗口支持,允许用户一次在屏幕上打开两个应用.在手持设备上,两个应用可以在"分屏"模式中左右并排或上下并排显示.在电视设备 ...
- linux系统的三种网络连接模式
VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...
- CBV装饰校验的三种方式session
代码如下: from django.shortcuts import render,HttpResponse,redirect from django.views import View # Crea ...
- 概念与用法-cookie,session,auth (认证系统)
COOKIE 与 SESSION 概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie ...
- Django 认证系统 cookie & session & auth模块
概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原理是:由服务器产生内容,浏 ...
- java获得当前系统时间三种方法
参见: http://blog.csdn.net/cloume/article/details/46624637
- redhat系统下三种主要的软件包安装方法
1. 通过RPM软件包来安装 RPM(Redhat Package Management)标准的软件包,只需简单地输入命令“rpm -ivh filename.rpm”即可: 如果需要对已经安装的RP ...
- django cookie,session,auth
一.最完美的auth auth_user 是用来存储的用户注册的username,password auth 首先需要引入模块 from django.contrib import auth 用户认证 ...
随机推荐
- LeetCode第[55]题(Java):Jump Game
题目:跳跳游戏 难度:Medium 题目内容: Given an array of non-negative integers, you are initially positioned at the ...
- 编写程序时候莫名出现<property name="dialect">org.hibernate.dialect.FirebirdDialect</property>
把<propertyname="dialect">org.hibernate.dialect.FirebirdDialect</property> 语句去掉 ...
- static-静态类型
1.基本概念 好像没什么概念. 2.作用 主要是两个:隐藏和保持值 01.隐藏 当在一个文件中定义了一个static全局变量,则该变量对该文件是可见的,对其他的文件不可见,也就减少了变量冲突的问题. ...
- ARM的异常处理方式
1.什么是异常? 正常工作之外的流程都叫异常 异常会打断正在执行的工作,并且一般我们希望异常处理完成后继续回来执行原来的工作 中断是异常的一种 2.异常向量表 所有的CPU都有异常向量表,这是CPU设 ...
- 四则运算生成与校检 Python实现
GitHub地址 https://github.com/little-petrol/Arithmetic.git 合作者: 郭旭 和 卢明凯 设计实现过程 代码的组织主要分为两个部分: 算法与结构体的 ...
- HTTPPost/AFNetWorking/JSONModel/NSPredicate
一.HTTPPost================================================ 1. POST方式发送请求 HTTP协议下默认数据发送请求方法是GET方式,若需要 ...
- Git的origin和master分析
首先要明确一点,对git的操作是围绕3个大的步骤来展开的(其实几乎所有的SCM都是这样) 1. 从git取数据(git clone) 2. 改动代码 3. 将改动传回git(git push) 这3个 ...
- c++指针初探
业余时间准备重温一下c++,因为在阅读Android源码到native层的时候感觉有点吃力,只是在大学时候很不用心的学过c++,所以重温下以便打好一些编程基础知识,本篇就很简单的对c++的指针做初步的 ...
- => 应用在js回调函数中
=> 可以简化以前的回调函数的调用,具体来说: 今后,几乎所有的回调函数都可用箭头函数简化 比如: 1. 所有回调函数都可: 去function改=> 2. 如果函数体只有一句话: 可省略 ...
- for-in和for 循环 的区别
以前早就知道,for...in 语句用于对数组或者对象的属性进行循环操作,而for循环是对数组的元素进行循环,而不能引用于非数组对象, 但咱在js项目里,遇到循环,不管是数组还是对象,经常使用for- ...