Django實(shí)現(xiàn)注冊(cè)闪幽、登陸、認(rèn)證token等功能

今天來(lái)記錄一下涡匀,使用django開(kāi)發(fā)中盯腌,經(jīng)常用到的注冊(cè)、登陸陨瘩、認(rèn)證攜帶token這些基本的功能腕够,基本每一個(gè)網(wǎng)站開(kāi)發(fā)都離不開(kāi),好記性不如爛筆頭舌劳,開(kāi)始

注冊(cè)

1:先定義路由帚湘,

from  django.urls  import  path
from  .views import  RegisterView,LoginView,TestAuthView

urlpatterns = [
    path('register/', RegisterView.as_view()),
]

2:定義具體的視圖函數(shù)

import uuid

import redis
from django.shortcuts import render
from rest_framework.views import APIView
from .serializer import RegisterSerializer
from utils.base_response import BaseResponse
from rest_framework.response import Response
from Course.models import Account
from utils.redis_pool import POOL
from utils.test_auth import LoginAuth
#注冊(cè)
class RegisterView(APIView):

    def post(self, request):
        result = BaseResponse()
        # 用序列化器做校驗(yàn)
        ser_obj = RegisterSerializer(data=request.data)
        # 驗(yàn)證通過(guò)
        if ser_obj.is_valid():
            ser_obj.save()
            result.data = ser_obj.data
        else:
            result.code = 500
            result.error = ser_obj.errors
        return Response(result.dict)

ps:這里注意的是,注冊(cè)必須post方法哦蒿囤,為了安全客们,提交之前會(huì)調(diào)用RegisterSerializer這個(gè)序列化器,進(jìn)行參數(shù)的校驗(yàn)材诽,驗(yàn)證通過(guò)則調(diào)用save方法底挫,進(jìn)行數(shù)據(jù)庫(kù)保存,認(rèn)證失敗脸侥,返回錯(cuò)誤字典給前端建邓,上代碼
3:定義序列化器

from rest_framework import serializers
from Course.models import Account
import hashlib


class RegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = '__all__'

    # 重寫(xiě)報(bào)錯(cuò)新增的方法
    def create(self, validated_data):
        pwd = validated_data['pwd']
        # 進(jìn)行加密
        pwd_sawt = "dong" + pwd
        md5_str = hashlib.md5(pwd_sawt.encode()).hexdigest()
        # save
        user_obj = Account.objects.create(username=validated_data['username'], pwd=md5_str)
        return user_obj

ps:這里使用了md5加密密碼,防止密碼明文提交睁枕,保證安全
好了官边,準(zhǔn)備測(cè)試看效果


image.png

使用post軟件進(jìn)行測(cè)試沸手,


image.png

可以看到用戶創(chuàng)建成功了,數(shù)據(jù)庫(kù)中也生成了對(duì)應(yīng)的記錄
image.png

登陸

接下來(lái)就是登陸功能了注簿,使用我們剛剛創(chuàng)建好的用戶契吉,來(lái)登陸看看是否可以登陸成功了
1:定義路由

from  django.urls  import  path
from  .views import  RegisterView,LoginView,TestAuthView

urlpatterns = [
    path('register/', RegisterView.as_view()),
    path('login/', LoginView.as_view()),
]

2:定義視圖函數(shù)

import uuid
import redis
from django.shortcuts import render
from rest_framework.views import APIView
from .serializer import RegisterSerializer
from utils.base_response import BaseResponse
from rest_framework.response import Response
from Course.models import Account
from utils.redis_pool import POOL
class LoginView(APIView):

    def post(self, request):
        result = BaseResponse()
        username = request.data.get('username', '')
        pwd = request.data.get('pwd', '')
        user_obj = Account.objects.filter(username=username, pwd=pwd).first()
        # 用戶驗(yàn)證失敗
        if not user_obj:
            result.code = 500
            result.error = "用戶么或者密碼錯(cuò)誤"
            return Response(result.dict)
        # 用戶驗(yàn)證成功,存入redis
        # 寫(xiě)入redis  token : user_id
        conn = redis.Redis(connection_pool=POOL)
        try:
            token = uuid.uuid4()
            # conn.set(str(token), user_obj.id, ex=10)
            conn.set(str(token), user_obj.id,ex=10)
            result.data = token
        except Exception as e:
            print(e)
            result.code = 501
            result.error = "創(chuàng)建令牌失敗啦"
        return Response(result.dict)

ps:這里使用redis進(jìn)行輔助诡渴,將驗(yàn)證成功的用戶放入redis數(shù)據(jù)庫(kù)捐晶,然后方便后續(xù)直接可以通過(guò)token,獲取用戶ID妄辩,{token : user_id}惑灵,這樣就可以快速獲取用戶ID,查詢用戶眼耀,方便其他接口的調(diào)用英支,或者傳參使用,
ex=10,代表在redis中的過(guò)期時(shí)間哮伟,單位是秒(seconds)
獻(xiàn)上工具類(lèi)代碼

class    BaseResponse(object):
    def  __init__(self):
        self.code   = 200
        self.data  = None
        self.error =  None
    @property
    def dict(self):
        return  self.__dict__
import  redis

POOL = redis.ConnectionPool(host="127.0.0.1", port=6379, decode_responses=True, max_connections=10)

3:登陸測(cè)試干花,看效果


image.png

必須使用加密后的密碼登陸,因?yàn)槲覀冏隽思用苊魑奶幚?/p>

image.png

認(rèn)證

當(dāng)我們?cè)谡{(diào)用其他的接口的時(shí)候澈吨,必須在header中攜帶一個(gè)請(qǐng)求頭把敢,這個(gè)請(qǐng)求頭攜帶者token,從而告訴服務(wù)器谅辣,我們已經(jīng)登陸過(guò)了,或者沒(méi)有登陸婶恼,因?yàn)閔ttp是一個(gè)無(wú)狀態(tài)協(xié)議桑阶,無(wú)法判斷這次請(qǐng)求的用戶到底是誰(shuí),那么接下來(lái)我們就看下具體怎實(shí)現(xiàn)的吧勾邦?
1:先定義一個(gè)路由蚣录,就用TestAuthView來(lái)實(shí)現(xiàn)具體的視圖吧

from  django.urls  import  path
from  .views import  RegisterView,LoginView,TestAuthView

urlpatterns = [
    path('register/', RegisterView.as_view()),
    path('login/', LoginView.as_view()),
    path('test_auth/', TestAuthView.as_view()),
]

2:調(diào)用LoginAuth進(jìn)行驗(yàn)證

import uuid
import redis
from django.shortcuts import render
from rest_framework.views import APIView
from .serializer import RegisterSerializer
from utils.base_response import BaseResponse
from rest_framework.response import Response
from Course.models import Account
from utils.redis_pool import POOL
from utils.test_auth import LoginAuth
class TestAuthView(APIView):
    authentication_classes = [LoginAuth]

    def get(self, request):
        return Response('我在進(jìn)行認(rèn)證登陸測(cè)試哦')

3:登陸認(rèn)證

import redis
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from .redis_pool import POOL
import redis
from Course.models import Account

CONN = redis.Redis(connection_pool=POOL)


class LoginAuth(BaseAuthentication):
    def authenticate(self, request):
        # 從請(qǐng)求頭中獲取前端帶過(guò)來(lái)的token
        token = request.META.get('HTTP_AUTHENTICATION', '')
        if not token:
            raise AuthenticationFailed('沒(méi)有攜帶token..')
        # 去redis進(jìn)行比較
        user_id = CONN.get(str(token))
        if not user_id:
            raise AuthenticationFailed('token過(guò)期啦..')
        else:
            user_obj = Account.objects.filter(pk=user_id).first()
            return user_obj, token

ps:所有驗(yàn)證類(lèi)都必須繼承BaseAuthentication基類(lèi),重寫(xiě)authenticate方法

***從請(qǐng)求頭中獲取前端帶過(guò)來(lái)的token

4.從請(qǐng)求頭中獲取前端帶過(guò)來(lái)的token
5.驗(yàn)證token是否存在
6.驗(yàn)證token和reidis中的user_id比較
7.將次user_id在數(shù)據(jù)中查詢眷篇,返回用戶對(duì)象和token
8:測(cè)試看效果
這里我們?cè)趐ost發(fā)起請(qǐng)求萎河,不加AUTHENTICATION


image.png

這里我們?cè)趐ost發(fā)起請(qǐng)求,加HTTP_AUTHENTICATION


image.png

這里我們?cè)趐ost發(fā)起請(qǐng)求蕉饼,加AUTHENTICATION虐杯,但是我們隨便寫(xiě)個(gè)
image.png

這里我們?cè)趐ost發(fā)起請(qǐng)求,加AUTHENTICATION,用正確的上一步登陸返回的token作為值來(lái)測(cè)試昧港,
image.png

image.png

認(rèn)證成功擎椰!
每天進(jìn)步一點(diǎn)點(diǎn),千里之行始于足下创肥!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末达舒,一起剝皮案震驚了整個(gè)濱河市值朋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巩搏,老刑警劉巖昨登,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異贯底,居然都是意外死亡丰辣,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)丈甸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)糯俗,“玉大人,你說(shuō)我怎么就攤上這事睦擂〉孟妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵顿仇,是天一觀的道長(zhǎng)淘正。 經(jīng)常有香客問(wèn)我,道長(zhǎng)臼闻,這世上最難降的妖魔是什么鸿吆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮述呐,結(jié)果婚禮上惩淳,老公的妹妹穿的比我還像新娘。我一直安慰自己乓搬,他們只是感情好思犁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著进肯,像睡著了一般激蹲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上江掩,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天学辱,我揣著相機(jī)與錄音,去河邊找鬼环形。 笑死策泣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斟赚。 我是一名探鬼主播着降,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拗军!你這毒婦竟也來(lái)了任洞?” 一聲冷哼從身側(cè)響起蓄喇,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎交掏,沒(méi)想到半個(gè)月后妆偏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盅弛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年钱骂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挪鹏。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡见秽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讨盒,到底是詐尸還是另有隱情解取,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布返顺,位于F島的核電站禀苦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遂鹊。R本人自食惡果不足惜振乏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秉扑。 院中可真熱鬧慧邮,春花似錦、人聲如沸舟陆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吨娜。三九已至,卻和暖如春淘钟,著一層夾襖步出監(jiān)牢的瞬間宦赠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工米母, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勾扭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓铁瞒,卻偏偏與公主長(zhǎng)得像妙色,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慧耍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容