上篇文章我們引出了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()
修改密碼:
- 用代碼的方式,可以使用上篇講過的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對象的差異:
- id永遠是None
- is_staff和is_superuser永遠為False
- groups和user_permissions永遠為空
- is_anoymous()為True
- is_authenticated()為False
- 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的創建和使用。
