django 自帶auth 模塊小記

創(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字符。
email 可選。 郵件地址。
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)該自己做這件事。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容