Django認證系統同時處理認證和受權。簡單地講,認證驗證一個用戶是否它們聲稱的那我的,受權決定一個經過了認證的用戶被容許作什麼。這裏的詞語「認證」同時指代這兩項任務。html
認證系統包含:
python
用戶數據庫
權限:二元(是/否)標誌指示一個用戶是否能夠作一個特定的任務。django
組:對多個用戶運用標籤和權限的一種通用的方式。安全
一個可配置的密碼哈希系統session
用於登陸用戶或限制內容的表單和視圖框架
一個可插拔的後臺系統ide
使用:ui
位於django.contrib.auth,配置在settings.py中的url
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): ...
主要完成兩件事:
一、若是用戶沒有登入,則重定向到settings.LOGIN_URL(須要設置),並將當前訪問的絕對路徑傳遞到查詢字符串中。例如:/accounts/login/?next=/polls/3/。
二、若是用戶已經登入,則正常執行視圖。視圖的代碼能夠安全地假設用戶已經登入。
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 '/')