Django Auth认证

一、

  from  django.contrib import  auth

  1  auth.authenticate(request, username='', password='')  

        提供了用户认证功能,即验证用户名以及密码是否正确

        一般需要username 、password两个关键字参数。

        如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。

          认证失败,返回None

  2  auth.login(request, User 对象)         

        该函数接受一个HttpRequest对象,以及一个经过认证的User对象(上步中的)。

        该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。

 

        注意:auth.login(request,User对象)该函数会再次调用AuthenticationMiddleware,更新request.user值

 

           AuthenticationMiddleware中间件,此中间件会给 request 加字段

           request.user = User对象(已登录用户对象) / AnonymousUser(匿名用户对象)

           

  3  auth.logout(request)

        注销,当调用该函数时,当前请求 的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

  4       from  django.contrib.auth.decorators  import  login_required

      @auth.deractors.login_required       (要进行此操作需要先进行登录)

      默认跳转的登录url : /accounts/login

      配置自己的url : LOGIN_URL = '/login/'

  5  is_authenticate()

       用法:  request.user.is_authenticated()

      用来判断当前请求是否通过了认证。 

      当前页面特殊ajax请求,需要先登录:

      def my_view(request):

         if not request.user.is_authenticated():

            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

  6  from  django.contrib.auth.models  import  User

      用法:

      User.objects.create_user()  创建新用户,普通用户   is_staff为0 ,    并返回该用户对象

      User.objects. create_superuser()创建新的超级用户,    并返回该超级用户对象

 

      需要提供必要参数(username、password、email):

      from django.contrib.auth.models import User

      user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)

     

      check_password() 密码正确返回True          

      ok = user.check_password('密码')

 

      set_password(password=‘’)  修改密码,参数传新密码。注意:设置完一定要调用用户对象的save方法!!!   

      user.set_password(password='')

      user.save()

@login_required
def set_password(request):
    user = request.user
    err_msg = ''
    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:
                err_msg = '新密码不能为空'
            elif new_password != repeat_password:
                err_msg = '两次密码不一致'
            else:
                user.set_password(new_password)
                user.save()
                return redirect("/login/")
        else:
            err_msg = '原密码输入错误'
    content = {
        'err_msg': err_msg,
    }
    return render(request, 'set_password.html', content)

修改密码示例
修改密码示例

 

 

 

       User对象的属性:

        username, password

        is_staff :    用户是否拥有网站的管理权限.

        is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录.

 

二、扩展默认的 auth_user 表

 

  方法一:(项目开始就搞)(适用于新项目)

 

  我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。

  这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了。 

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    """
    用户信息表
    """
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    
    def __str__(self):
        return self.username

  

  注意:

    按上面的方式扩展了内置的auth_user表之后,一定要在settings.py中告诉Django,

    我现在使用我新定义的UserInfo表来做用户认证。写法如下:

        # 引用Django自带的User表,继承使用时需要设置

      AUTH_USER_MODEL = "app名.UserInfo"

      # 顺便改下其他设置

      LANGUAGE_CODE = 'zh-hans'

      TIME_ZONE = 'Asia/Shanghai'



 
 再次注意:

    一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,

    而不能继续使用原来默认的auth_user表了。

  注意:  在定义自定义用户模型之前要保证以前没执行过数据迁移命令

       使用时,不要直接使用自定义的用户模型,这里就是 UserInfo。

       相反应该使django.contrib.auth.get_user_model() ,该函数会返回当前指定的用户模型。

       当在一个模型中定义外键或多对多关系要使用 UserInfo 模型时,使用 settings.AUTH_USER_MODEL。

 

     方法二:(官方推荐)

  使用Profile拓展一张私密信息表

  OneToOneField

 1 from django.db import models
 2 from django.contrib.auth.models import User
 3 from django.db.models.signals import post_save
 4 # Create your models here.
 5 
 6 
 7 class UserInfo(models.Model):
 8 
 9     user = models.OneToOneField(User, on_delete=models.CASCADE)
10     major = models.TextField(default='', blank=True)
11     address = models.CharField(max_length=200, default='', blank=True)
12 
13     def __unicode__(self):
14         return self.user.username
15 
16 
17 def create_user_profile(sender, instance, created, **kwargs):
18     if created:
19         profile = UserInfo()
20         profile.user = instance
21         profile.save()
22 
23 
24 post_save.connect(create_user_profile, sender=User)
models.py
1 AUTH_PROFILE_MODULE = 'Authapp.UserInfo'
settings.py
 1 from django.contrib import admin
 2 from Authapp.models import UserInfo
 3 from django.contrib.auth.models import User
 4 from django.contrib.auth.admin import UserAdmin
 5 # Register your models here.
 6 
 7 
 8 class ProfileInline(admin.StackedInline):
 9     model = UserInfo
10     can_delete = False
11     max_num = 1
12 
13 
14 class CustomUserAdmin(UserAdmin):
15     inlines = [ProfileInline, ]
16 
17 
18 admin.site.unregister(User)
19 admin.site.register(User, CustomUserAdmin)
admin.py(后台管理)

  注意注意注意:联表之后,问题直接就变成了1对1查询,是反向查询,按小写表名(驼峰体要全小写).

  参考:http://onlypython.group.iteye.com/group/wiki/1519-expansion-django-user-model-by-non-profile-way

     这大神应该 是 苑浩老师 吧      必须膜拜一下!!!

  参考:https://www.zmrenwu.com/post/31/  详细透彻

  参考: 1.https://blog.csdn.net/kongxx/article/details/50621745    只有Profile比较好

      2.https://www.cnblogs.com/yxi-liu/p/8684504.html     四种拓展方法

 

 

  注意:

  Django2.0    一对一,必须加 on_delete=models.CASCADE

  参考:https://www.cnblogs.com/phyger/p/8035253.html

 

 

 

assert  断言

 

  

 

ok

转载于:https://www.cnblogs.com/kingon/p/9453598.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值