Django認證系統同時處理認證和授權。簡單地講,認證驗證一個用戶是否它們聲稱的那個人,授權決定一個通過了認證的用戶被允許做什麼。這裏的詞語“認證”同時指代這兩項任務。
認證系統包含:
用戶
權限:二元(是/否)標誌指示一個用戶是否可以做一個特定的任務。
組:對多個用戶運用標籤和權限的一種通用的方式。
一個可配置的密碼哈希系統
用於登錄用戶或限制內容的表單和視圖
一個可插拔的後臺系統
使用:
位於django.contrib.auth,配置在settings.py中的
INSTALLED_APPS = [
'django.contrib.auth', #包含認證框架的核心和默認的模型。
'django.contrib.contenttypes',] #是Django內容類型系統,它允許權限與你創建的模型關聯。
和
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',#管理請求之間的會話。
'django.contrib.auth.middleware.AuthenticationMiddleware',] #使用會話將用戶與請求關聯起來。
有了這些設置,運行manage.py migrate命令將爲認證相關的模型創建必要的數據庫表併爲你的應用中定義的任意模型創建權限
登錄:
from django.contrib.auth import authenticate, login def my_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is not None: if user.is_active: login(request, user) # Redirect to a success page. else: # Return a 'disabled account' error message ... else: # Return an 'invalid login' error message. ...
註銷:
from django.contrib.auth import logout def logout_view(request): logout(request) # Redirect to a success page.
只允許登錄的用戶訪問:
方法一:
from django.conf import settings from django.shortcuts import redirect def my_view(request): if not request.user.is_authenticated(): return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path)) # ...
方法二:
login_required裝飾器
from django.contrib.auth.decorators import login_required @login_required def my_view(request): ...
主要完成兩件事:
1、如果用戶沒有登入,則重定向到settings.LOGIN_URL(需要設置),並將當前訪問的絕對路徑傳遞到查詢字符串中。例如:/accounts/login/?next=/polls/3/。
2、如果用戶已經登入,則正常執行視圖。視圖的代碼可以安全地假設用戶已經登入。
from django.contrib.auth.decorators import login_required @login_required(login_url='/accounts/login/') def my_view(request): ...
注意,如果你沒有指定login_url參數,你需要確保settings.LOGIN_URL與你的登錄視圖正確關聯。例如,使用默認值,可以添加下面幾行到你的URLconf中:
from django.contrib.auth import views as auth_views url(r'^accounts/login/$', auth_views.login),
跳轉到登錄之前的頁面,即next=XXX頁面:
from django.contrib.auth.decorators import login_required from django.shortcuts import redirect @login_required(login_url='/accounts/login/') def my_view(request): return redirect(request.GET.get('next') or '/')