zoukankan      html  css  js  c++  java
  • django(权限、认证)系统——自定义UserProfile储存User额外信息

    上篇文章我们引出了Django内置的权限控制系统,讲了安装,和最核心和基本的User模型的API和其Manager的API。

    接下来我们继续深入下去,使用User对象做一些事情,首先当然就是创建一个User对象了。

    让我们执行python manage.py shell启动Django的shell:

    创建User:

    1 >>> from django.contrib.auth.models import User
    2 >>> user = User.objects.create_user('esperyong''esperyong@gmail.com''123456')
    3 # 现在一个is_active属性为True的User对象已经创建并存入数据库中了。
    4 # 接下来我们可以对其属性进行修改,然后存入数据库。
    5 >>> user.is_staff = True
    6 >>> user.save()

    修改密码:

    1. 用代码的方式,可以使用上篇讲过的set_password方法进行设置,最后存入数据库的将是进行过hash转换的密文。
      1 >>> from django.contrib.auth.models import User
      2 >>> u = User.objects.get(username__exact='esperyong')
      3 >>> u.set_password('new password')
      4 >>> u.save()

          2. 用python manage.py changepassword *username*来进行修改,需要输入两次密码。

      千万不要直接给User的password属性赋值。

    匿名用户,AnonymousUser:

    django.contrib.auth.models.AnonymousUser是实现了User接口的类。在用户还没有用权限系统登陆的时候,在request.user中使用的就是该对象,用户可以通过调用is_anonymous()方法来验证是否为匿名用户。以下是该对象和User对象的差异:

    1. id永远是None
    2. is_staff和is_superuser永远为False
    3. groups和user_permissions永远为空
    4. is_anoymous()为True
    5. is_authenticated()为False
    6. set_password(),check_password(),save(),delete(),set_groups()和set_permissions()抛出NotImplementedError.

    使用UserProfile存储用户的额外信息 :

    在Django中,有一种机制可以让你存储和User在某个Site相关的一些信息到一个对象中,这个对象就是UserProfile。

    1.首先,我们需要定义这个模型,这个模型需要一个和User模型相关的一对一关系属性,如下:

    from django.contrib.auth.models import User
     
    class UserProfile(models.Model):
        # 和User的一对一关系属性,该属性必填.
        user = models.OneToOneField(User)
     
        # 其他需要存储的属性
        # User因为是Django提供的,如果想要在其上增加一些自己需要的字段和方法,不太好加入,因此UserProfile是达成这个目标的一个有利工具
        accepted_eula = models.BooleanField()
        favorite_animal = models.CharField(max_length=20, default="Dragons.")

    2.接下来要在settings中声明一个变量,变量名为AUTH_PROFILE_MODULE,值为 appname.profile类名,如下:

    AUTH_PROFILE_MODULE = 'accounts.UserProfile'

    这样,我们的User对象的get_profile()方法就会返回这个对象了。需要注意的一点是,UserProfile对象不会和User一起自动创建,需要以某种方式自己搞定这件事情。最合理的最Djangoist的方式就是注册一个handler到User的post_save signal了。具体请参阅Django的文档,例:

    # 在 models.py
     
    from django.contrib.auth.models import User
    from django.db.models.signals import post_save
     
    # 定义了UserProfile
    # ...
     
    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            UserProfile.objects.create(user=instance)
     
    post_save.connect(create_user_profile, sender=User)

      

     本篇文章和上一篇文章说明的Django Authentication系统中的核心基础模型,User模型相关API还有UserProfile的使用方法。

    接下来我们要进入实际的Web开发中对这套认证系统的使用,包括用户登录,许可的创建,分配和使用,还有用户组Group的创建和使用。

  • 相关阅读:
    clearstatcache清除文件状态缓存
    使用mysql创建自己的物化视图
    python——复制目录结构小脚本
    开发一个jQuery插件——多级联动菜单
    pack、unpack自制二进制“数据库”
    博客爬取系统
    session放入缓存(redis)、DB
    centos+nginx从零开始配置负载均衡
    几个容易被忽略的mysql知识
    数组方式进行表单提交
  • 原文地址:https://www.cnblogs.com/wangwei916797941/p/7398944.html
Copyright © 2011-2022 走看看