djangorestframework用戶認(rèn)證-創(chuàng)新互聯(lián)

BaseAuthentication 類:
    django rest framework 通過 BaseAuthentication 實現(xiàn)認(rèn)證功能
    無論是自定義的認(rèn)證類還是 rest framework 自帶的認(rèn)證類都應(yīng)該繼承 BaseAuthentication
    BaseAuthentication 中有兩個方法 authenticate 和 authenticate_header, 其中 authenticate 方法必須實現(xiàn)
    如果用戶需要自定義認(rèn)證方法則繼承 BaseAuthentication 重寫 authenticate 方法即可

?
models.py

創(chuàng)新互聯(lián)建站不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認(rèn)可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級,滿足企業(yè)一站式網(wǎng)絡(luò)營銷推廣需求,讓再小的品牌網(wǎng)站設(shè)計也能產(chǎn)生價值!
from django.db import models
class UserInfo(models.Model):
        user_type_choices = (
                (1, '普通用戶'),
                (2, 'VPI'),
                (3, 'SVPI'),
        )
        user_type = models.IntegerField(choices=user_type_choices)
        username = models.CharField(max_length=32, unique=True)
        password = models.CharField(max_length=64)

class UserToken(models.Model):
        user = models.OneToOneField('UserInfo', models.CASCADE)
        token = models.CharField(max_length=64)

?
APP_DIR/utils/auth.py ? ? ? ? ? # 在和 views.py 同級的目錄創(chuàng)建 utils 包, 在 utils 中創(chuàng)建 auth.py 文件, 將認(rèn)證相關(guān)的代碼放入其中

from rest_framework import exceptions
from rest_framework.authentication import BaseAuthentication
from app01 import models

# 實現(xiàn)自定義的認(rèn)證類
class Authtication(BaseAuthentication):
        def authenticate(self, request):
                # 這兒的 request 對象不是 django 原生的 request 而是 rest_framework 內(nèi)部進(jìn)行封裝過的 request
                # 使用 request._request 調(diào)用 django 原生的 request 對象
                token = request._request.GET.get('token')
                # 檢查用戶的 token 是否合法
                token_obj = models.UserToken.objects.filter(token=token).first()
                if not token_obj:
                        # rest_framework 會在內(nèi)部捕捉這個異常并返回給用戶認(rèn)證失敗的信息
                        raise exceptions.AuthenticationFailed('用戶認(rèn)證失敗')
                # 在 rest_framework 內(nèi)部會將這兩個字段賦值給request以供后續(xù)調(diào)用
                return (token_obj.user, token_obj)


?
views.py

from django.http import JsonResponse
from rest_framework.views import APIView
from app01.utils.auth import Authtication
import hashlib
import time

# 生成 token 字符串
def md5(user):
        ctime = str(time.time())
        m = hashlib.md5(bytes(user, encoding='utf-8'))
        m.update(bytes(ctime, encoding='utf-8'))
        return m.hexdigest()

# 用戶登錄
class AuthView(APIView):
        def post(self, request):
                ret = {'code':1000, 'msg':None}
                try:
                        user = request._request.POST.get('username')
                        pwd = request._request.POST.get('password')

                        obj = models.UserInfo.objects.filter(username=user, password=pwd).first()
                        if not obj:
                                ret['code'] = 1001
                                ret['msg'] = "用戶名或密碼錯誤"
                        # 為登錄用戶創(chuàng)建token
                        token = md5(user)
                        #存在更新 不存在創(chuàng)建
                        models.UserToken.objects.update_or_create(user=obj, defaults={'token':token})
                        ret['token'] = token
                except:
                        ret['code'] = 1002
                        ret['msg'] = '請求異常'
                return JsonResponse(ret)

?!I(yè)務(wù)代碼
class Order(APIView):
        # 注冊自定義的認(rèn)證類, 可以有多個, 從左到右進(jìn)行認(rèn)證匹配
        authentication_classes = [Authtication,]

        def get(self, request):
                # request.user  這個值等于 Authtication 返回的元組的第一個值
                # request.auth  這個值等于 Authtication 返回的元組的第二個值
                ret = {'code':1000, 'msg':None, 'data':None}
                ret['data'] = '歡迎使用本系統(tǒng)'
                return JsonResponse(ret)

?
rest_framework 內(nèi)置的認(rèn)證類:

BasicAuthentication             # 基于瀏覽器實現(xiàn)的 Basic 認(rèn)證, ftp 使用網(wǎng)頁登錄時使用的就是 Basic 認(rèn)證
SessionAuthentication           # 基于 django 的 user.is_active 進(jìn)行認(rèn)證
TokenAuthentication             # 簡單的基于 token 的認(rèn)證
RemoteUserAuthentication        # 簡單的遠(yuǎn)程用戶認(rèn)證實現(xiàn)

?

配置全局生效的認(rèn)證類和匿名用戶:

自定義的認(rèn)證類如果每次都在指定的類中使用 authentication_classes 指定那么就有可能出現(xiàn)大量的重復(fù)代碼
我們可以通過全局設(shè)置讓指定的認(rèn)證類對繼承至 APIView 的所有類生效

settings.py
        REST_FRAMEWORK = {
                # 設(shè)置全局生效的認(rèn)證類(可以有多個)
                # app01 為 django app 的名稱
                # utils 為 app 目錄下面的 utils 目錄(這個目錄必須包含 __init__.py 文件)
                # auth 為 utils 目錄下面的 auth.py 文件
                # Authtication 為 auth.py 文件里面的 Authtication 類
                # 這兒的設(shè)置其實就是使用 from ... import ... 的路徑

                'DEFAULT_AUTHENTICATION_CLASSES': ["app01.utils.auth.Authtication",],

                #匿名用戶配置
                'UNAUTHENTICATED_USER': None,           # 設(shè)置匿名用戶的用戶名, 默認(rèn)為 AnonymousUser, 使用 request.user 查看
                'UNAUTHENTICATED_TOKEN': None,          # 設(shè)置匿名用戶的 token, 默認(rèn)為 None, 使用 request.auth 查看
        }

?

指定 View 類不使用全局的認(rèn)證類:

在不使用全局認(rèn)證類的 View 類中添加 authentication_classes = [] 或者 authentication_classes = ['xxxx']
# authentication_classes = [] 表示不使用認(rèn)證
# authentication_classes = ['xxxx'], xxxx 表示當(dāng)前類需要使用的認(rèn)證類用于替換全局類

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前文章:djangorestframework用戶認(rèn)證-創(chuàng)新互聯(lián)
地址分享:http://www.bm7419.com/article46/iphhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計公司網(wǎng)站排名、做網(wǎng)站品牌網(wǎng)站建設(shè)、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)