創(chuàng)建用戶
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user(username='john',
... email='jlennon@beatles.com',
... password='glass onion')
修改密碼
>>> user = User.objects.get(username='john')
>>> user.set_password('goo goo goo joob')
>>> user.save()
User屬性
| username | 必需的,不能多于30個字符。 僅用字母數(shù)字式字符(字母、數(shù)字和下劃線)。 |
|---|---|
| first_name | 可選; 少于等于30字符。 |
| last_name | 可選; 少于等于30字符。 |
| 可選。 郵件地址。 | |
| password | 必需的。 密碼的哈希值(Django不儲存原始密碼)。 See the Passwords section for more about this value. |
| is_staff | 布爾值。 用戶是否擁有網(wǎng)站的管理權(quán)限。 |
| is_active | 布爾值. 設(shè)置該賬戶是否可以登錄。 把該標志位置為False而不是直接刪除賬戶。 |
| is_superuser | 布爾值 標識用戶是否擁有所有權(quán)限,無需顯式地權(quán)限分配定義。 |
| date_joined | 賬號被創(chuàng)建的日期時間 當賬號被創(chuàng)建時,它被默認設(shè)置為當前的日期/時間。 |
| last_login | 用戶上次登錄的時間日期。 它被默認設(shè)置為當前的日期/時間。 |
User方法
| 方法 | 描述 |
|---|---|
| is_authenticated() | 對于真實的User對象,總是返回True 。這是一個分辨用戶是否已被鑒證的方法。 它并不意味著任何權(quán)限,也不檢查用戶是否仍是活動的。 它僅說明此用戶已被成功鑒證。 |
| get_full_name() | 返回first_name 加上last_name ,中間插入一個空格。 |
| set_password(passwd) | 設(shè)定用戶密碼為指定字符串(自動處理成哈希串)。 實際上沒有保存User對象。 |
| check_password(passwd) | 如果指定的字符串與用戶密碼匹配則返回True。 比較時會使用密碼哈希表。 |
| get_group_permissions() | 返回一個用戶通過其所屬組獲得的權(quán)限字符串列表。 |
| get_all_permissions() | 返回一個用戶通過其所屬組以及自身權(quán)限所獲得的權(quán)限字符串列表。 |
| has_perm(perm) | 如果用戶有指定的權(quán)限,則返回True ,此時perm 的格式是"package.codename" 。如果用戶已不活動,此方法總是返回False 。 |
登陸和退出
Django 提供內(nèi)置的視圖(view)函數(shù)用于處理登錄和退出 (以及其他奇技淫巧),但在開始前,我們來看看如何手工登錄和退出。 Django提供兩個函數(shù)來執(zhí)行django.contrib.auth\中的動作 : authenticate()和login()。
認證給出的用戶名和密碼,使用 authenticate() 函數(shù)。它接受兩個參數(shù),用戶名 username 和 密碼 password ,并在密碼對給出的用戶名合法的情況下返回一個 User 對象。 如果密碼不合法,authenticate()返回None。
>>> from django.contrib import auth
>>> user = auth.authenticate(username='john', password='secret')
>>> if user is not None:
... print "Correct!"
... else:
... print "Invalid password."
authenticate() 只是驗證一個用戶的證書而已。 而要登錄一個用戶,使用 login() 。該函數(shù)接受一個HttpRequest 對象和一個 User 對象作為參數(shù)并使用Django的會話( session )框架把用戶的ID保存在該會話中。
下面的例子演示了如何在一個視圖中同時使用 authenticate() 和 login() 函數(shù):
登陸
from django.contrib import auth
def login_view(request):
username = request.POST.get('username', '')
password = request.POST.get('password', '')
user = auth.authenticate(username=username, password=password)
if user is not None and user.is_active:
# Correct password, and the user is marked "active"
auth.login(request, user)
# Redirect to a success page.
return HttpResponseRedirect("/account/loggedin/")
else:
# Show an error page
return HttpResponseRedirect("/account/invalid/")
登出
from django.contrib import auth
def logout_view(request):
auth.logout(request)
# Redirect to a success page.
return HttpResponseRedirect("/account/loggedout/")
它接受一個HttpRequest對象并且沒有返回值。
即使用戶沒有登錄, logout() 也不會拋出任何異常。
限制已登陸用戶的訪問
from django.http import HttpResponseRedirect
def my_view(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/?next=%s' % request.path)
# ...
也可以使用login_required修飾符
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
# ...
login_required 做下面的事情:
- 如果用戶沒有登錄, 重定向到 /accounts/login/ , 把當前絕對URL作為 next 在查詢字符串中傳遞過去, 例如: /accounts/login/?next=/polls/3/ 。
- 如果用戶已經(jīng)登錄, 正常地執(zhí)行視圖函數(shù)。 視圖代碼就可以假定用戶已經(jīng)登錄了。
對于不同權(quán)限的訪問限制
限制訪問可以基于某種權(quán)限,某些檢查或者為login視圖提供不同的位置,這些實現(xiàn)方式大致相同。
一般的方法是直接在視圖的 request.user 上運行檢查。 例如,下面視圖確認用戶登錄并是否有polls.can_vote權(quán)限:
def vote(request):
if request.user.is_authenticated() and request.user.has_perm('polls.can_vote')):
# vote here
else:
return HttpResponse("You can't vote in this poll.")
并且Django有一個稱為 user_passes_test 的簡潔方式。它接受參數(shù)然后為你指定的情況生成裝飾器。
def user_can_vote(user):
return user.is_authenticated() and user.has_perm("polls.can_vote")
@user_passes_test(user_can_vote, login_url="/login/")
def vote(request):
# Code here can assume a logged-in user with the correct permission.
...
user_passes_test 使用一個必需的參數(shù): 一個可調(diào)用的方法,當存在 User 對象并當此用戶允許查看該頁面時返回True 。 注意 user_passes_test 不會自動檢查 User是否認證,你應(yīng)該自己做這件事。