登陆验证

  因为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")

最新文章

  1. SQL SERVER 2008 r2安装失败之Integration Service
  2. linux command file/type which/whereis
  3. 三种对话框的示例(alert,confirm,prompt)
  4. boost之bind
  5. iOS开发--使用RSA加密
  6. Json部分知识(前台显示格式、Json-lib日期处理)
  7. Implement Trie (Prefix Tree) 解答
  8. Qt for Android遇到的几个错误解决[Win7 + Qt5.6 +jdk 8u91]
  9. sqlserver备份的几种方式
  10. python Mysql (二)
  11. windows下使用curl命令 && 常用curl命令
  12. html概述和基本结构
  13. Java基础——Ajax(三)
  14. window + php + memcached 安装
  15. POJ 2387 Til the Cows Come Home 【最短路SPFA】
  16. centos7.2 增加3T的XFS模式分区
  17. JMeter--详解JMeter配置元件
  18. android NavigationBar 显示
  19. Templated Helper Methods(二)
  20. js计算数值

热门文章

  1. php爬虫框架选用什么
  2. .net操作Oracle数据库步骤及方法
  3. mysql 库与表操作
  4. 如何拿到半数面试公司Offer——我的Python求职之路(转载)
  5. LeetCode OJ:Search a 2D Matrix(二维数组查找)
  6. LeetCode OJ:Two Sum(两数之和)
  7. OS快捷键
  8. ADO.NET数据库访问技术(转)
  9. Android代码混淆及项目发布方法记录
  10. Android数据读取之Sqlite数据库操作