目錄html
Django提供的auth認證組件,提供了: 用戶表的構建方式(用於知足符合auth組件);提供了認證接口;提供了會話登陸和會話註銷的接口 ;提供了中間件將會話登陸用戶保存到request對對象中,這樣能夠很輕易的拿到登陸用戶,不用咱們再從會話中獲取用戶id,再經過model獲取到用戶對象;對於認證接口要提供用戶名和密碼傳入auth.authenticate(username,password),認證成功,就能夠獲得認證用戶對象。咱們只須要根據認證結果是否有對象,來斷定認證結果,來進行後面的操做。同時返回的用戶對象傳入auth.login(request, user)接口,調用接口,能夠將用戶登陸信息記錄到session中,而且若是添加了auth的一箇中間件AuthenticationMiddleware,那麼每次請求會在request.user中保存該登陸的用戶對象。若是沒登錄request.user會保存一個anonymouseuser用戶,這樣就能夠經過request.user的API來斷定本次請求是不是某個用戶登陸狀態。這點是auth組件關鍵點,這也是涉及到隱含session記錄建立和auth中間件對request對象的操做。前端
from django.contrib.auth.models import AbstractUser from django.db import models class Users(AbstractUser): age = models.IntegerField(verbose_name='年齡', blank=True, null=True) telephone = models.CharField(verbose_name='手機號', max_length=32) address = models.CharField(verbose_name='住址', max_length=255) def __str__(self): return self.username # username屬性繼承自AbstractUser
方便在模版系統中渲染登陸用戶的信息。前提是使用auth組件進行會話登陸及其中間件。python
即 auth.authenticate() 與 request.user.is_authenticated 的使用場景和功能區別:ajax
導入語句: from django.contrib.auth.decorators import login_required
用法:用於裝飾須要視圖函數;使用了該裝飾器的函數,會斷定是否已登陸用戶,若是沒有將重定向到settings.LOGIN_URL指定的url並帶上一個next參數,next參數傳入當前視圖訪問的絕對路徑,已用於在登陸後跳轉的路徑。這樣,login視圖在登陸成功後的跳轉,就能夠從next提交的值獲取,並設置一個獲取不到的默認值爲'index'首頁就能夠了。很方便的裝飾器和其修改的next參數,其中next可用於模版中。
用法:django
@login_required def list_customer(request): """ 查看用戶列表 :param request: :return: """ pass return HttpResponse('用戶列表')
若是要自定義,能夠繼承AbstractUser這個抽象model。這就涉及到了model的繼承。抽象繼承屬於model繼承的table_per_class模式。api
user model提供了建立user object 的接口create_user();修改密碼的接口user.set_password()。這個操做普通model直接操做create,update數據不一樣,必須經過接口,由於密碼是加密存儲的。session
# 登陸驗證頁面 def login(request): if request.method == 'POST': response = { 'user': None, 'msg': None, } login_name = request.POST.get('username') # 由於使用的是ajax提交表單數據,對於表單數據的校驗就放到前端吧. pwd = request.POST.get('password') valid_code = request.POST.get('valid_code') if valid_code.upper() == request.session['valid_code'].upper(): # 只作驗證碼校驗和用戶認證校驗。 user = auth.authenticate(username=login_name, password=pwd) if user: auth.login(request, user) # 這樣request.user 就會有當前登陸對象 response['user'] = user.username return JsonResponse(response) else: response['msg'] = '用戶名或密碼錯誤!' return JsonResponse(response) else: response['msg'] = '驗證碼錯誤!' return JsonResponse(response) return render(request, 'myblog/login.html')