1. 验证种类概要

  • create_user 制造用户
  • authenticate 验证登6
  • login 记住用户的记名状态
  • logout 退出登入
  • is_authenticated 判定用户是还是不是登入
  • login_required 推断用户是不是登入的装饰器

1. 评释系统概要

  • create_user 创立用户
  • authenticate 验证登陆
  • login 记住用户的报到状态
  • logout 退出登陆
  • is_authenticated 判定用户是还是不是登入
  • login_required 判定用户是或不是登入的装饰器

1. 表明系列概要

auth模块简要介绍

二. 成立用户和验证登6

  1. 当用户注册的时候用create_user(username,password,email)暗许意况下is_active=True,is_staff=False,is_superuser=False

    • 底层将password用hash算法加密之后存款和储蓄到数据库中。
  2. 当用户登陆的时候用authenticate(username=username,password=password)证实登六,决断数据库中是或不是存在用户输入的账号和密码,重返贰个user对象。

    • 底层将password用hash算法加密后和数据库中password进行比较。

二. 创造用户和表达登入

  1. 当用户注册的时候用create_user(username,password,email)金沙注册送58 ,默许情形下is_active=True,is_staff=False,is_superuser=False

    • 底层将password用hash算法加密之后存储到数据库中。
  2. 当用户登陆的时候用authenticate(username=username,password=password)证实登入,判定数据库中是或不是留存用户输入的账号和密码,再次来到三个user对象。

    • 底层将password用hash算法加密后和数据库中password进行相比。

create_user 创立用户

auth模块是对登陆认证方式的一种包装,此前大家赚取用户输入的用户名及密码后必要团结从user表里询问有未有用户名和密码符合的靶子,

3. 记住用户的报随情况

当用户登入的时候用login(request,user)来记住用户的登6状态,默许将用户的id存款和储蓄在session中。

  • login有七个参数三个是request,贰个是user,user的来自必须是authenticate返回的。约等于说用login事先必须先调用authenticate

③. 记住用户的报到状态

当用户登入的时候用login(request,user)来记住用户的记名状态,暗中认可将用户的id存款和储蓄在session中。

  • login有七个参数1个是request,三个是user,user的源于必须是authenticate返回的。相当于说用login在此以前务必先调用authenticate

authenticate 验证登入

而有了auth模块然后就能够很自在的去验证用户的登入音讯是还是不是存在于数据库中。

肆. 退出登入

当用户注销的时候用logout(request),只供给三个参数request。

四. 退出登陆

当用户注销的时候用logout(request),只供给一个参数request。

login 记住用户的报到状态

除了,auth还对session做了部分包装,方便大家校验用户是或不是已登录

伍. 判定用户是或不是登入

  1. 在后台的视图函数里能够用request.user.is_authenticated()看清用户是还是不是登陆
  2. 在前者页面中得以用{% if user.is_authenticated %}{% endif %}用户认证,Django用户认证系统。看清用户是或不是登六

5. 剖断用户是或不是登入

  1. 在后台的视图函数里能够用request.user.is_authenticated()决断用户是不是登6
  2. 在前者页面中能够用{% if user.is_authenticated %}{% endif %}判断用户是还是不是登入

logout 退出登陆

auth里的章程

陆. 装饰器判定用户是还是不是登录

  1. 依照普通的视图函数能够动用@login_required来装点,可是依照类视图的get和post方法不可能一贯动用@login_required来装饰。
  2. 据他们说类视图的装点有以下二种:

    • 第二种:在urls文件中程导弹入login_requtred,直接装饰as_view()函数

    url(r'^$', login_required(UserInfoView.as_view()), name='user') 
    
    • 第一种:自定义一个LoginRequiredView类继承View类,重写as_view()函数,并装饰as_view()函数的重返值。
      大家自定义的视图类就不供给再持续View类,直接接轨LoginRequiredView类就好了。

        class LoginRequiredView(View):
            @classmethod
            def as_view(cls, **initkwargs):
                # 调用View类中as_view方法
                view = super(LoginRequiredView, cls).as_view(**initkwargs)
                # 调用login_required装饰器
                return login_required(view)
      
    • 其两种:自定义贰个LoginRequiredMixin类,重写as_view()函数,调用View中的as_view()函数,并装饰as_view()函数的重回值。
      大家自定义的视图类必要先延续LoginRequiredMixin类再持续View类。那种方法的关键点在于:多三番捌次中super()的调用顺序和__mro__的逐条是均等的

        class LoginRequiredMixin(object):
            @classmethod
            def as_view(cls, **initkwargs):
                # 调用View类中as_view方法
                view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
      
                # 调用login_required装饰器
                return login_required(view)
      

六. 装饰器判定用户是还是不是登入

  1. 遵照普通的视图函数能够运用@login_required来装点,但是依照类视图的get和post方法不能够直接采取@login_required来装饰。
  2. 听大人说类视图的装裱有以下两种:

    • 率先种:在urls文件中程导弹入login_requtred,直接装饰as_view()函数

    url(r'^$', login_required(UserInfoView.as_view()), name='user') 
    
    • 第二种:自定义叁个LoginRequiredView类继承View类,重写as_view()函数,并装饰as_view()函数的重临值。
      大家自定义的视图类就不需求再持续View类,直接接轨LoginRequiredView类就好了。

        class LoginRequiredView(View):
            @classmethod
            def as_view(cls, **initkwargs):
                # 调用View类中as_view方法
                view = super(LoginRequiredView, cls).as_view(**initkwargs)
                # 调用login_required装饰器
                return login_required(view)
      
    • 其两种:自定义一个LoginRequiredMixin类,重写as_view()函数,调用View中的as_view()函数,并装饰as_view()函数的再次回到值。
      大家自定义的视图类供给先延续LoginRequiredMixin类再持续View类。那种方法的关键点在于:多一而再中super()的调用顺序和__mro__的依次是1律的

        class LoginRequiredMixin(object):
            @classmethod
            def as_view(cls, **initkwargs):
                # 调用View类中as_view方法
                view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
      
                # 调用login_required装饰器
                return login_required(view)
      

is_authenticated 判定用户是或不是登陆

比方想利用auth模块的点子,必须求开端入auth模块

login_required 判别用户是还是不是登6的装饰器

from django.contrib import auth

贰.
创造用户和评释登入

django.contrib.auth中提供了重重办法,那里最主要介绍当中的八个:

当用户注册的时候用create_user(username,password,email)暗许情况下is_active=True,is_staff=False,is_superuser=False。

1 、authenticate()  

底层将password用hash算法加密之后存款和储蓄到数据库中。

提供了用户认证,即验证用户名以及密码是不是正确,1般必要username 
password多个根本字参数

当用户登⑥的时候用authenticate(username=username,password=password)验证登六,判定数据库中是或不是存在用户输入的账号和密码,再次回到多少个user对象。

万1评释音讯有效,会回来二个  User  对象。authenticate()会在User
对象上安装3个属性标志那种认证后端认证了该用户,且该消息在末端的登陆进度中是需求的。当大家打算登录二个从数据库中一向抽取来不经过authenticate()的User对象会报错的!!

底层将password用hash算法加密后和数据库中password实行对照。

user = authenticate(username='someone',password='somepassword')

三.
记住用户的报到状态

2 、login(HttpRequest, user)

当用户登陆的时候用login(request,user)来记住用户的记名状态,私下认可将用户的id存款和储蓄在session中。

该函数接受三个HttpRequest对象,以及二个验证了的User对象

login有八个参数三个是request,八个是user,user的根源必须是authenticate重回的。也正是说用login在此之前务必先调用authenticate。

此函数使用django的session框架给某些已证实的用户附加上session id等音信。

4. 退出登入

from django.contrib.auth import authenticate, login

def my_view(request):
  username = request.POST['username']
  password = request.POST['password']
  user = authenticate(username=username, password=password)
  if user is not None:
    login(request, user)
    # Redirect to a success page.
    ...
  else:
    # Return an 'invalid login' error message.
    ...

当用户注销的时候用logout(request),只须要几个参数request。

3 、logout(request) 注销用户

5. 剖断用户是或不是登六

该函数接受一个HttpRequest对象,无再次回到值。当调用该函数时,当前呼吁的session音讯会全部消除。该用户就是未有登录,使用该函数也不会报错。

在后台的视图函数里能够用request.user.is_authenticated()判别用户是还是不是登入

from django.contrib.auth import logout

def logout_view(request):
  logout(request)
 # Redirect to a success page.

在前端页面中可以用{% if user.is_authenticated %}{% endif
%}判别用户是不是登入

4 、user对象的 is_authenticated()

六.
装饰器推断用户是或不是登入

要求:

基于普通的视图函数能够选择@login_required来装饰,可是依照类视图的get和post方法无法向来动用@login_required来装饰。

一  用户登录后技艺访问壹些页面,

依照类视图的装潢有以下二种:

二  假如用户并未登6就访问该页面包车型客车话一贯跳到登6页面

第一种:在urls文件中程导弹入login_requtred,直接装饰as_view()函数

三  用户在跳转的登入分界面中形成登入后,自动访问跳转到以前访问的地点

url(r'^$', login_required(UserInfoView.as_view()), name='user') 

方法1:

第二种:自定义3个LoginRequiredView类继承View类,重写as_view()函数,并装饰as_view()函数的再次来到值。
大家自定义的视图类就不需求再持续View类,直接接轨LoginRequiredView类就好了。

直接用auth的is_authenticated()方法求证

class LoginRequiredView(View):
  @classmethod
  def as_view(cls, **initkwargs):
    # 调用View类中as_view方法
    view = super(LoginRequiredView, cls).as_view(**initkwargs)
    # 调用login_required装饰器
    return login_required(view)
def my_view(request):
   if not request.user.is_authenticated():
      return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

第三种:自定义一个LoginRequiredMixin类,重写as_view()函数,调用View中的as_view()函数,并装饰as_view()函数的重临值。
大家自定义的视图类供给先延续LoginRequiredMixin类再持续View类。那种办法的关键点在于:多再而三中super()的调用顺序和__mro__的相继是1律的。

方法2:

class LoginRequiredMixin(object):
  @classmethod
  def as_view(cls, **initkwargs):
    # 调用View类中as_view方法
    view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
    # 调用login_required装饰器
    return login_required(view)

基于request.user.username来验证,假设为空,则说明未有登入

如上那篇基于Django用户认证种类详解便是笔者分享给咱们的全体内容了,希望能给大家二个参阅,也可望我们多多帮忙脚本之家。

def my_view(request):
   if not request.user.username:
      return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

你可能感兴趣的篇章:

  • 深刻理解Django中内置的用户认证
  • 行使Django内置的辨证视图完成用户密码重新恢复设置功效详解
  • Django自定义用户认证示例详解

方法3:

django已经为大家设计好了1个用于此种景况的装饰器:login_requierd()

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
 ...

若用户并未有登入,则会跳转到django默许的 登入U奥迪Q5L ‘/accounts/login/ ‘
(那么些值可以在settings文件中经过LOGIN_UCRUISERL举办修改)。并传递 
当前拜会url的相对路线 ( 登入成功后,会重定向到该路线 )。

user对象

User 对象属性:username,
password(必填项)password用哈希算法保存到数据库

is_staff : 用户是还是不是具备网址的管理权限.

is_active : 是或不是允许用户登入,
设置为“False“,能够毫无删除用户来禁止 用户登陆

2.1 、is_authenticated()

比方是实在的 User 对象,重临值恒为 True 。
用于检查用户是还是不是已经因此了表达。

通过验证并不表示用户全部别样权力,甚至也不反省该用户是不是处于激活状态,那只是注解用户成功的经过了求证。
那么些方法很主要,
在后台用request.user.is_authenticated()剖断用户是或不是曾经报到,借使true则能够向前台呈现request.user.name

二.二 、制造用户

使用 create_user 支持函数创立用户:

from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')

2.3 、check_password(passwd)

user = User.objects.get(username=' ')
if user.check_password(passwd):
  ......

用户供给修改密码的时候 首先要让他输入原来的密码
,假若给定的字符串通过了密码检查,再次来到  True

使用 set_password() 来修改密码

user = User.objects.get(username='')
user.set_password(password='')
user.save 

贰.5 、轻便示例

注册:

def sign_up(request):

  state = None
  if request.method == 'POST':

    password = request.POST.get('password', '')
    repeat_password = request.POST.get('repeat_password', '')
    email=request.POST.get('email', '')
    username = request.POST.get('username', '')
    if User.objects.filter(username=username):
        state = 'user_exist'
    else:
        new_user = User.objects.create_user(username=username, password=password,email=email)
        new_user.save()

        return redirect('/book/')
  content = {
    'state': state,
    'user': None,
  }
  return render(request, 'sign_up.html', content)  

修改密码:

@login_required
def set_password(request):
  user = request.user
  state = None
  if request.method == 'POST':
    old_password = request.POST.get('old_password', '')
    new_password = request.POST.get('new_password', '')
    repeat_password = request.POST.get('repeat_password', '')
    if user.check_password(old_password):
      if not new_password:
        state = 'empty'
      elif new_password != repeat_password:
        state = 'repeat_error'
      else:
        user.set_password(new_password)
        user.save()
        return redirect("/log_in/")
    else:
      state = 'password_error'
  content = {
    'user': user,
    'state': state,
  }
  return render(request, 'set_password.html', content)

友善创办User表

亟待注意的是,以上的有着操作,都以指向django自动创立的auth_user表的,大家得以看一下这张表的构造

金沙注册送58 1

那是django给大家机关成立的一张user表,而只要要用auth模块,就必供给使用(或接续)那张表。

承继表的便宜是大家得以追加壹些谈得来索要的字段,并且同时能够运用auth模块提供的接口、方法

上边就讲一下承接auth的措施:

一、导入AbstractUser类,并且写叁个自定义的类,承继AbstractUser类,如下:

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
  """
  用户信息
  """
  nid = models.AutoField(primary_key=True)
  telephone = models.CharField(max_length=11, null=True, unique=True)
  ......

要求注意的是,UserInfo表里就不要求有auth_user里重复的字段了,比如说username以及password等,可是依然得以一向动用那一个字段的,并且django会自动将password举行加密

二、那样写完以往,还索要在setting.py文件里铺排:

AUTH_USER_MODEL = 'blog.UserInfo'

这么,django就知道从blog项目下的models去查找UserInfo这张表了

以上正是本文的全部内容,希望对大家的读书抱有协理,也意在我们多多辅助脚本之家。

您恐怕感兴趣的篇章:

  • django接入天涯论坛天涯论坛OAuth的艺术
  • DJANGO-ALLAUTH社交用户系统的安装配置

相关文章

网站地图xml地图