通過session,我們可以在多次瀏覽器請求中保持數據, 接下來的部分就是用session來處理用戶登錄了。 當然,不能僅憑用戶的一面之詞,我們就相信,所以我們需要認證。
當然了,Django 也提供了工具來處理這樣的常見任務(就像其他常見任務一樣)。 Django 用戶認證系統處理用戶帳號,組,權限以及基于cookie的用戶會話。 這個系統一般被稱為 auth/auth (認證與授權)系統。 這個系統的名稱同時也表明了用戶常見的兩步處理。 我們需要
如果你已經用了admin工具(詳見第6章),就會看見這些工具的大部分。如果你在admin工具中編輯過用戶或組,那么實際上你已經編輯過授權系統的數據庫表了。
打開認證支持
像session工具一樣,認證支持也是一個Django應用,放在 django.contrib 中,所以也需要安裝。 與session系統相似,它也是缺省安裝的,但如果它已經被刪除了,通過以下步驟也能重新安裝上:
這樣安裝后,我們就可以在視圖(view)的函數中處理user了。 在視圖中存取users,主要用 request.user ;這個對象表示當前已登錄的用戶。 如果用戶還沒登錄,這就是一個AnonymousUser對象(細節見下)。
你可以很容易地通過 is_authenticated() 方法來判斷一個用戶是否已經登錄了:
1 2 3 4 | if request.user.is_authenticated(): # Do something for authenticated users. else : # Do something for anonymous users. |
使用User對象
User 實例一般從 request.user ,或是其他下面即將要討論到的方法取得,它有很多屬性和方法。 AnonymousUser 對象模擬了 部分 的接口,但不是全部,在把它當成真正的user對象 使用前,你得檢查一下 user.is_authenticated() 表14-3和14-4分別列出了`` User`` 對象中的屬性(fields)和方法。
System Message: ERROR/3 (<string>, line 735)
Error parsing content block for the “table” directive: exactly one table expected.
.. table:: 表 ``User`` 對象方法
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|方法 |描述 |
+=============================================================================================+======================================================================================================================================================+
|``is_authenticated()`` |對于真實的User對象,總是返回/ `` True`` 。 |
| |這是一個分辨用戶是否已被鑒證的方法。 它并不意味著任何權限,也不檢查用戶是否仍是活動的。 它僅說明此用戶已被成功鑒證。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``is_anonymous()`` |對于/ `` AnonymousUser`` 對象返回/ `` True`` (對于真實的/ `` User`` 對象返回/ `` False`` )。 |
| |總的來說,比起這個方法,你應該傾向于使用/ `` is_authenticated()`` 方法。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``get_full_name()`` |返回/ `` first_name`` 加上/ `` last_name`` ,中間插入一個空格。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``set_password(passwd)`` |設定用戶密碼為指定字符串(自動處理成哈希串)。 實際上沒有保存/ ``User``/對象。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|check_password(passwd) |如果指定的字符串與用戶密碼匹配則返回/ ``True``/。 比較時會使用密碼哈希表。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``get_group_permissions()`` |返回一個用戶通過其所屬組獲得的權限字符串列表。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``get_all_permissions()`` |返回一個用戶通過其所屬組以及自身權限所獲得的權限字符串列表。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``has_perm(perm)`` |如果用戶有指定的權限,則返回/ `` True`` ,此時/ `` perm`` 的格式是/ `` "package.codename"`` 。如果用戶已不活動,此方法總是返回/ `` False`` 。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|has_perms(perm_list) |如果用戶擁有/ * 全部* 的指定權限,則返回/ `` True`` 。 如果用戶是不活動的,這個方法總是返回/ `` False`` 。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``has_module_perms(app_label)`` |如果用戶擁有給定的/ `` app_label`` 中的任何權限,則返回/ `` True`` 。如果用戶已不活動,這個方法總是返回/ `` False`` 。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|get_and_delete_messages() |返回一個用戶隊列中的/ `` Message`` 對象列表,并從隊列中將這些消息刪除。 |
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|``email_user(subj, msg)`` |向用戶發送一封電子郵件。 這封電子郵件是從/ `` DEFAULT_FROM_EMAIL`` 設置的地址發送的。 你還可以傳送一個第三參數:/ `` from_email`` ,以覆蓋電郵中的發送地址。|
+---------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
最后,`` User`` 對象有兩個many-to-many屬性。 `` groups`` 和`` permissions`` 。正如其他的many-to-many屬性使用的方法一樣,`` User`` 對象可以獲得它們相關的對象:
- # Set a user's groups:
- myuser.groups = group_list
- # Add a user to some groups:
- myuser.groups.add(group1, group2,...)
- # Remove a user from some groups:
- myuser.groups.remove(group1, group2,...)
- # Remove a user from all groups:
- myuser.groups.clear()
- # Permissions work the same way
- myuser.permissions = permission_list
- myuser.permissions.add(permission1, permission2, ...)
- myuser.permissions.remove(permission1, permission2, ...)
- myuser.permissions.clear()
新聞熱點
疑難解答