概要:

        form组件回顾:

            (1) 创建form组件对应的类,比如LoginForm
(2)
views.login: if get请求:
form_obj=LoginForm()
return render(request,"login.html",{"form_obj":form_obj}) # 由form_obj渲染form表单的有效控件 渲染方式三种:
1
<form action="" novalidate method="post">
{% csrf_token %}
{{ form_obj.as_p }}
<input type="submit">
</form> 2
<form action="" novalidate method="post">
{% csrf_token %}
<div>
<label for="">用户名</label>
{{ form_obj.user }} <span>{{ form_obj.errors.user.0 }}</span>
</div>
<div>
<label for="">密码</label>
{{ form_obj.pwd }}<span>{{ form_obj.errors.pwd.0 }}</span>
</div>
<input type="submit">
</form> 3 <form action="" novalidate method="post">
{% csrf_token %}
{% for field in form_obj %}
<div>
<label for="">{{ field.label }}</label>
{{ field }}
</div>
{% endfor %} <input type="submit">
</form> if post请求: form_obj = LoginFrom(request.POST)
if form_obj.is_valid():
form_obj.cleaned_data # 所有的有效数据 else:
#form_obj.errors # {}
#form_obj.errors.get("user") # [] return render(request, "login.html", {"form_obj": form_obj}) 2 auth --- django的认证系统 A S session写操作
request.session["user"]=user
'''
1、生成随机字符串
2、写cookie {"sessionID":"234asd243dv35fd"}
3、django-session表:
session-key session-data
234asd243dv35fd {"user":"alex"}
''' session读操作
user=request.session.get("user") '''
1 {"sessionID":"234asd243dv35fd"}
2 django-session表:
session-key session-data
234asd243dv35fd {"user":"alex"}
3 {"user":"alex"}.get("user")
''' request.session到底是什么? 认证系统: request.user 1 使用auth_user表作为用户表 2 登录:
user=auth.authenticate(username=user,password=pwd)
auth.login(request,user) # session写操作
3 注销
auth.logout(request) # session删操作 request.session.flush() 4 验证 user.is_authenticated() # 登录状态时,返回True,否则返回False 5 创建用户:User.objects.create_user(username="egon123",password="") 今日作业: 1 看 session 中间件源码 2 基于用户认证实现 登录注册注销功能,登录用户与未登录用户显示不同页面

我们的登录验证是浏览器级别的验证还有用户级别的验证,

使用我们的django内部的数据库表,auth_user,然后使用它内部的一些模块和方法

在视图函数里面需要引入模块写逻辑代码:

from django.shortcuts import render,redirect

# Create your views here.

from django.contrib import auth
from django.contrib.auth.models import User
# 以上两句是固定模式,
def log_in(request): if request.method=="POST":
user=request.POST.get("user")
pwd=request.POST.get("pwd")
# 验证成功,返回user对象,否则返回None
user=auth.authenticate(username=user,password=pwd) if user:
auth.login(request,user) # session写操作
return redirect("/index/") return render(request,"login.html") def index(request):
print(request.user)
print(type(request.user)) # if not request.user.id:
# return redirect("/login/") # user=request.user
# if not user.is_authenticated():return redirect("/login/") return render(request,"index.html",locals()) def log_out(request):
auth.logout(request)
return redirect("/login/") def reg(request):
User.objects.create_user(username="egon123",password="1234") return redirect("/login/")

authenticate()

提供用户认证,即验证用户名以及密码是否正确,一般需要表中的username,password连个关键字参数.

如果认证信息有效,会返回一个user对象,authenticate()会在user对象上设置一个属性,表示那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的,当我们试图登录一个从数据库中取出来不经过authenticate()的user对象会报错!

在验证中我们有几种状态固定语句:

登录:login

user1=auth.authenticate(username=user,password=pwd)

auth.login(request,user1)  # 类似于session写操作

此函数使用django的session框架给某个已经认证的用户附加上session等信息

==============================================================

退出登录状态:logout

auth.logout(request)

request.session.flush()

该函数接收一个httprequest的对象没有返回值,当调用该函数的时候,当前请求的session信息会全部清除,该用户没有登录,使用该函数也不会报错.

=================================================

验证  :User对象的is_authenticated()方法

user.is_authenticated()

登录状态时,返回True,否则返回False

1,当用户登录时才可以访问某些页面,(有点类似于我们的cookie和session设置的状态)

2,如果没有登录,系统会检测到,然后强行让用户去登录,会自动就把页面跳转到登录页面去

3,用户在跳转的登录界面中完成了登录后,自动访问到跳转登录之前所访问的地址

方法一:

def login(request):

  if not request.user.is_authenticated():

    return redirect('%s?next=%s' % (settings.LONGING_URL,request.path))  # 这里是比较简单的

方法二:

from django.contrib.auth.decorators import login_required

@login_required

def login(request):

```````

如果用户没有登录的话,会跳转到django默认的登录url'/accounts/login/'(这里的值通过settings文件中LOGIN_URL进行修改).并传递,当前访问url的绝对路径(登录成功后,会重定向到该路径)   

===================================================

创建用户:

user.objects.create_user(username='egon',password='1234')

User对象:

如果是真正的user对象,返回值恒为True.用于检查用户是否已经通过了认证,通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表名用户成功通过了认证.在后台用request.user.is_authenticated()判断用户是否已经登录,如果True则可以向前台展示request.user.name

check_password(passwd)

用户修改密码之前让其输入原来的密码进行校验,通过了验证之后返回True

然后使用set_password()来修改密码

我们下面的示例就是一个简单的index页面,我们的用户如果登录的话就可以看到该页面的设置了用户权限的信息,

如果没有登录就会看到这个页面没有设置用户权限的信息.这两种状态都是通过我们的auth内置方法去实现的.

具体代码如下,

views视图函数:

from django.shortcuts import render, redirect

# Create your views here.
from django.contrib import auth
from django.contrib.auth.models import User # 登录+注册页面
def login1(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
username = auth.authenticate(username=user, password=pwd)
if username:
auth.login(request, username)
return redirect('/auth/index1/')
else:
# 这里就是注册,create_user这一句话就完成了注册效果
User.objects.create_user(username=user, password=pwd)
return redirect('/auth/index1')
return render(request, 'proof/login1.html') # 登录与否皆可显示该页面效果
def index1(request):
user = request.user
return render(request, 'proof/index1.html', locals()) # 注销
def out(request):
auth.logout(request)
return redirect('/auth/login1') # 注册页面
def reg(request):
return redirect('/auth/login1') # 修改密码
def set_pwd(request):
user = request.user
state = None
if request.method == 'POST':
old_pwd = request.POST.get("old_pwd",)
new_pwd = request.POST.get('new_pwd',)
repeat_password = request.POST.get('repeat_pwd',)
if user.check_password(old_pwd):
if not new_pwd:
state = 'empty'
elif new_pwd != repeat_password:
state = 'repeat_error'
else:
user.set_password(new_pwd)
user.save()
return redirect('/auth/login1') else: # 我们这里是在做逻辑判断,如果我们在修改的密码的时候不小心输错了,
# 我们的页面需要有提示信息告诉用户输入错误请重新输入
state = '密码有误,请核对后再输'
content = { # 这里的字典是什么意思啊,使用locals把这个content传到我们的模板里面然后如果输入密码有误的话
# 就显示下面的这个字符串: {'user': <SimpleLazyObject: <User: wusir>>, 'state': '密码有误,请核对后再输'},
# 老师的代码里面直接写的content,我也不知道这个content需要放到哪里去,唉
'user': user,
'state': state,
}
return render(request, 'proof/set_password.html', locals())
return render(request, 'proof/set_password.html')

前端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">
<title>index1</title>
</head>
<body> {#<form action="/auth/index1/" method="post">#}
<form action="" method="post">
{% csrf_token %}
<p>用户名 <input type="text" name="user"></p>
<p>密码 <input type="password" name="pwd"></p>
<input type="submit">
</form> </body>
</html>

index页面(在这里进行逻辑判断用户是否是登录状态):

<!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">
<title>index1</title>
<style>
.a1{
float:right
}
</style>
</head>
<body> <h1>welcome here</h1>
<p>hello {{ user }}</p>
<hr> {% if request.user.is_authenticated %}
<a class="a1" href="/auth/out/">注销</a>
<a class="a1" href="/auth/set_pwd">修改密码</a> <h2>you're coming home {{ request.user.username }}</h2>
{% else %}
{# 我们这里不用后端的视图函数去做判断,就直接用我们的前端的模板语言的逻辑去做筛选#}
<a href="/auth/login1/">登录</a>
<a href="/auth/reg/">注册</a>
{% endif %}
</body>
</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">
<title>Title</title>
</head>
<body> <form action="" method="post">
{% csrf_token %}
<div>旧密码: <input type="password" name="old_pwd"><span>{{ content }}</span></div>
<p>新密码: <input type="password" name="new_pwd"></p>
<div>确认密码: <input type="password" name="repeat_pwd"></div>
<button type="submit" value="put in">提交</button>
</form> <script> </script>
</body>
</html>

url配置:

from django.conf.urls import url
from auth1 import views, session urlpatterns = [
url(r'^login1/$', views.login1),
url(r'^reg/$', views.reg),
url(r'^index1/$', views.index1),
url(r'^out/$', views.out),
url(r'^set_pwd/$', views.set_pwd),
]

day76 auth模块 用户验证,的更多相关文章

  1. auth模块用户认证

    一.auth模块什么 auth模块时django自带的用户认证模块 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功 ...

  2. Django之auth模块用户认证模块

    一.Auth模块 1)auth模块是什么.登录后台使用的账号密码,则就是使用的auth模块创建的表 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站 ...

  3. auth模块(登录验证)

    settings:'django.contrib.auth.middleware.AuthenticationMiddleware',#这个是认证的中间件,认证成功的话,就可以把这个用户user封装到 ...

  4. Django Auth模块及User对象方法

    一:Django的用户认证 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1:authenticat ...

  5. Django框架中auth模块的详解

    auth模块 auth模块是对登录认证方法的一种封装,本身就是一个对象,可以获取用户的详细信息,有了auth模块可以验证登录信息是否存在数据库中,还可以检验用户是否已经登录,校验密码等 auth方法 ...

  6. Django基础之auth模块

    内容概要 用户认证模块auth auth模块补充 auth_user表扩展字段 内容详细 auth模块 主要是用来做用户相关的功能 注册 登录 验证 修改密码 注销 ​ 访问admin需要管理员账号 ...

  7. php-laravel框架用户验证(Auth)模块解析(一)

    一.初始化 使用php artisan命令进行初始化:php artisan make:auth 和 php artisan migrate(该命令会生成users表.password_resets表 ...

  8. Django之auth模块(用户认证)

    auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之后就可以很轻松的去验证用户的 ...

  9. Django自带的用户认证auth模块

    一.介绍 基本上在任何网站上,都无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能. 使用Django,我们可以不需要自己写这些功能,因为Dj ...

随机推荐

  1. ubuntu 安装配置 mysql

    注:上一篇内容是直接使用虚拟机配置好的mysql数据库, 阿里云服务器的默认是没有mysql的. 下载安装 mysql: sudo apt-get update sudo apt-get instal ...

  2. 锤子科技"临死前"被"接盘" ,内部人士爆料已改签今日头条母公司

    就在昨天,据据锤子科技内部人士透露,部分锤子科技员工在昨天已经接到了相关的临时通知,要求改签劳动合同至今日头条的母公司——字节跳动.至于这是锤子科技真正再度复活还是借尸还魂都不重要,重要的是,作为忠实 ...

  3. swift 实践- 11 -- UISlider

    import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...

  4. swift 学习- 21 -- 类型转换

    // 类型转换 可以判断实例的类型, 也可以将实例看做其父类的或者子类的实例 // 类型转换在 Swift 中使用 is 和 as 操作符实现, 这两个操作符提供了一种简单达意的方式去检查值的类型 或 ...

  5. ORACLE环境变量定义

    export在linux的bash中可以理解为设置环境变量.设置后能够被当前的shell及子shell使用. 这些变量的含义有一些有意义,可以查看相应的文档,我给你解释一些我知道的: ORACLE_H ...

  6. Mycat配置文件详解及全局序列号

    来详细的看看 mycat的配置文件,更多信息请查看:mycat权威指南. schema.xml: Schema.xml 作为 MyCat 中重要的配置文件之一,管理着 MyCat 的逻辑库.表.分片规 ...

  7. eclipse检出SVN项目的正确步骤

    一.在工作空间新建工作目录:workspace-xf 二.在工作目录下workspace-xf 新建文件夹 tdvs ,进入该文件夹鼠标右键:SVN CheckOut  检出需要的项目 三.打开ecl ...

  8. python 内置数据类型之字符串

    1.3 字符串 字符串本身就是一个有序(从左至右)的字符的集合.是序列这种类型的一种,后面还要学习列表与元组. 在这一节中,需要了解字符串的定义,特殊字符,转义与抑制转义:字符串基本操作.格式化等. ...

  9. 小米8如何root

    现身说法,实测有效,也踩坑很多. 0. 准备手机.数据线.windows系统的电脑.小米帐号,各一个. 手机需要装上sim卡:电脑需要能上网.最好是有wifi的环境,用来下载安装包. 注意提前备份数据 ...

  10. MyBatis - 6.Spring整合MyBatis

    1.查看不同MyBatis版本整合Spring时使用的适配包: http://www.mybatis.org/spring/ 2.下载整合适配包 https://github.com/mybatis/ ...