Django源码血洗

作者: noai | 来源:发表于2016-10-12 14:36 被阅读207次

    Why

    很多东西光看文档搞不明白,遂找相关源码读之。

    Model

    在被较复杂数据关系搞晕后,我这LowLow的设计代码能力根本不够用了。
    那么从django的用户、组、权限系统开始吧。

    编码设计

    我自己的代码设计就是坨屎。

    编码规范

    我自己的代码就是坨屎。

    Djanog 1.9.6 >> Lib/site-packages/django/contrib/auth/models.py

    • 权限:
    class Permission(models.Model):
        """
        The permissions system provides a way to assign permissions to specific
        users and groups of users.
    
        The permission system is used by the Django admin site, but may also be
        useful in your own code. The Django admin site uses permissions as follows:
    
            - The "add" permission limits the user's ability to view the "add" form
              and add an object.
            - The "change" permission limits a user's ability to view the change
              list, view the "change" form and change an object.
            - The "delete" permission limits the ability to delete an object.
    
        Permissions are set globally per type of object, not per specific object
        instance. It is possible to say "Mary may change news stories," but it's
        not currently possible to say "Mary may change news stories, but only the
        ones she created herself" or "Mary may only change news stories that have a
        certain status or publication date."
    
        Three basic permissions -- add, change and delete -- are automatically
        created for each Django model.
        """
        name = models.CharField(_('name'), max_length=255)
        content_type = models.ForeignKey(
            ContentType,
            models.CASCADE,
            verbose_name=_('content type'),
        )
        codename = models.CharField(_('codename'), max_length=100)
        objects = PermissionManager()
        class Meta:
            verbose_name = _('permission')
            verbose_name_plural = _('permissions')
            unique_together = (('content_type', 'codename'),)
            ordering = ('content_type__app_label', 'content_type__model',
                        'codename')
    
    • 组管理:
    class GroupManager(models.Manager):
        """
        The manager for the auth's Group model.
        """
        use_in_migrations = True
    
        def get_by_natural_key(self, name):
            return self.get(name=name)
    
    • 组:
    class Group(models.Model):
        """
        Groups are a generic way of categorizing users to apply permissions, or
        some other label, to those users. A user can belong to any number of
        groups.
    
        A user in a group automatically has all the permissions granted to that
        group. For example, if the group Site editors has the permission
        can_edit_home_page, any user in that group will have that permission.
    
        Beyond permissions, groups are a convenient way to categorize users to
        apply some label, or extended functionality, to them. For example, you
        could create a group 'Special users', and you could write code that would
        do special things to those users -- such as giving them access to a
        members-only portion of your site, or sending them members-only email
        messages.
        """
        name = models.CharField(_('name'), max_length=80, unique=True)
        permissions = models.ManyToManyField(
            Permission,
            verbose_name=_('permissions'),
            blank=True,
        )
    
        objects = GroupManager()
    
        class Meta:
            verbose_name = _('group')
            verbose_name_plural = _('groups')
    
    • 用户管理:
    class UserManager(BaseUserManager):
        use_in_migrations = True
    
        def _create_user(self, username, email, password, **extra_fields):
            """
            Creates and saves a User with the given username, email and password.
            """
            if not username:
                raise ValueError('The given username must be set')
            email = self.normalize_email(email)
            user = self.model(username=username, email=email, **extra_fields)
            user.set_password(password)
            user.save(using=self._db)
            return user
    
        def create_user(self, username, email=None, password=None, **extra_fields):
            extra_fields.setdefault('is_staff', False)
            extra_fields.setdefault('is_superuser', False)
            return self._create_user(username, email, password, **extra_fields)
    
        def create_superuser(self, username, email, password, **extra_fields):
            extra_fields.setdefault('is_staff', True)
            extra_fields.setdefault('is_superuser', True)
    
            if extra_fields.get('is_staff') is not True:
                raise ValueError('Superuser must have is_staff=True.')
            if extra_fields.get('is_superuser') is not True:
                raise ValueError('Superuser must have is_superuser=True.')
    
            return self._create_user(username, email, password, **extra_fields)
    
    • 组与权限关联:
    class PermissionsMixin(models.Model):
        """
        A mixin class that adds the fields and methods necessary to support
        Django's Group and Permission model using the ModelBackend.
        """
        is_superuser = models.BooleanField(
            _('superuser status'),
            default=False,
            help_text=_(
                'Designates that this user has all permissions without '
                'explicitly assigning them.'
            ),
        )
        groups = models.ManyToManyField(
            Group,
            verbose_name=_('groups'),
            blank=True,
            help_text=_(
                'The groups this user belongs to. A user will get all permissions '
                'granted to each of their groups.'
            ),
            related_name="user_set",
            related_query_name="user",
        )
        user_permissions = models.ManyToManyField(
            Permission,
            verbose_name=_('user permissions'),
            blank=True,
            help_text=_('Specific permissions for this user.'),
            related_name="user_set",
            related_query_name="user",
        )
    
        class Meta:
            abstract = True
    
    • 抽象用户:
    class AbstractUser(AbstractBaseUser, PermissionsMixin):
        """
        An abstract base class implementing a fully featured User model with
        admin-compliant permissions.
    
        Username and password are required. Other fields are optional.
        """
        username = models.CharField(
            _('username'),
            max_length=30,
            unique=True,
            help_text=_('Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.'),
            validators=[
                validators.RegexValidator(
                    r'^[\w.@+-]+$',
                    _('Enter a valid username. This value may contain only '
                      'letters, numbers ' 'and @/./+/-/_ characters.')
                ),
            ],
            error_messages={
                'unique': _("A user with that username already exists."),
            },
        )
        first_name = models.CharField(_('first name'), max_length=30, blank=True)
        last_name = models.CharField(_('last name'), max_length=30, blank=True)
        email = models.EmailField(_('email address'), blank=True)
        is_staff = models.BooleanField(
            _('staff status'),
            default=False,
            help_text=_('Designates whether the user can log into this admin site.'),
        )
        is_active = models.BooleanField(
            _('active'),
            default=True,
            help_text=_(
                'Designates whether this user should be treated as active. '
                'Unselect this instead of deleting accounts.'
            ),
        )
        date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
    
        objects = UserManager()
    
        USERNAME_FIELD = 'username'
        REQUIRED_FIELDS = ['email']
    
        class Meta:
            verbose_name = _('user')
            verbose_name_plural = _('users')
            abstract = True
    
    • 用户(Why?):
    class User(AbstractUser):
        """
        Users within the Django authentication system are represented by this
        model.
    
        Username, password and email are required. Other fields are optional.
        """
        class Meta(AbstractUser.Meta):
            swappable = 'AUTH_USER_MODEL'
    

    相关文章

      网友评论

        本文标题:Django源码血洗

        本文链接:https://www.haomeiwen.com/subject/jxsiyttx.html