Django中內置的權限控制2-User Profile


上篇文章我們引出了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的創建和使用。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM