路飞学城项目-登陆认证模块
生活随笔
收集整理的這篇文章主要介紹了
路飞学城项目-登陆认证模块
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
############### 注冊接口 ################
################## 注冊邏輯分析 ############################ # 前端: # 1,前端,傳過來用戶名和密碼,前端可以傳很多東西,比如頭像職業(yè)等等, # 后端, # 1,url, # 2,view,register類, # 3,model, # 4,serializers ################## register類 ############################ # 1,獲取用戶名和密碼, # 2,拿序列化器進行驗證, # 3,注冊成功之后,保存數(shù)據(jù)到數(shù)據(jù)庫,返回注冊成功,是否需要返回用戶名等其他信息,看前端的需要 ################## 序列化器的邏輯 ############################ # 1,需要重寫create方法,就是save的時候調(diào)用的方法,因為需要對傳過來的pwd進行加密,所以需要重寫, ################## 表模型分析: ############################ # 注冊有用戶名,密碼,token,創(chuàng)建token的時間, # 注意: # 1,傳輸過程中密碼需要加密,如何加密?md5如何加密? # 2,如何實現(xiàn)7天免登錄?
class Register(APIView):
def post(self,request):
ser_obj = UserInfoSerializers(data=request.data)
if ser_obj.is_valid():
ser_obj.save()
return Response('注冊成功')
else:
return Response(ser_obj.errors)
############### 登陸接口 ################
################## 登陸邏輯分析 ############################ # 前端: # 1,前端,傳過來用戶名和密碼 # 后端, # 1,url, # 2,view,login類, # 3,model, # 4,serializers ################## login類 ############################ # 1,獲取用戶名和密碼, # 2,判斷有沒有這個用戶對象, # 3,如果有生成token值, # 4,返回登陸成功或者失敗的信息 # 注意: # 寫代碼一定要try,這是一個編碼習慣,防止你的代碼崩 ################## BaseException類 ############################ # 1,繼承object, # 2,使用裝飾器把方法變成屬性, # 3,初始化的時候定義屬性
class Login(APIView):
def post(self,request):
ret = BaseException()
username = request.data.get('username','')
if not username:
ret.code=1001
ret.error='用戶名不能為空'
pwd = request.data.get('pwd','')
if not pwd:
ret.code=1002
ret.error='密碼不能為空'
try:
user_obj = UserInfo.objects.filter(username=username,pwd=pwd).first()
if not user_obj:
ret.code =1003
ret.error= '用戶或密碼錯誤'
user_obj.token= uuid.uuid4()
user_obj.save()
ret.data='登陸成功'
except Exception as e :
ret.code = 1004
ret.error ='登陸失敗'
return Response(ret.dict)
############### 認證 ################
################## 認證邏輯分析 ############################ # 前端 # 1,訪問其他頁面需要攜帶token, # 2,前端可以戴在header里面, # 后端: # 1,獲取到前端傳過來的token,這個值可能是放在header里面?zhèn)鬟^來,也可以是放到url里面?zhèn)鬟^來, # 2,判斷是否有這個token # 3,判斷token是否過期,過期了是不能登錄了,做一個校驗,這就是七天免登錄, # 4,返回一個元組,
class TokenAuth(BaseAuthentication):
def authenticate(self, request):
# 獲取前端傳過來的token,放在了header里面
# print(request.META)
token = request.META.get('HTTP_AUTHENTICATE','')
print(token)
if not token:
raise AuthenticationFailed({"code":1001,"error":"沒有攜帶token"})
# 判斷token是否存在
user_obj=UserInfo.objects.filter(token=token).first()
print(user_obj)
if not user_obj:
raise AuthenticationFailed({"code":1002,"error":"token不合法"})
# 判斷是否過期
old_time = user_obj.create_token_time
now_time = now()
print((old_time-now_time).days)
if (now_time-old_time).days > 7:
raise AuthenticationFailed({"code":1003,"error":"token過期"})
return (user_obj,token)
############### 需求 ################
登陸和認證, 每一個接口必須要登陸了才可以訪問, 使用token進行登陸認證,和接口訪問, 對認證又有了新的認識,權限,頻率這三個組件的用法一樣, 需要細細體會,
############### 表結構 ################
class UserInfo(models.Model):
user = models.CharField(max_length=32)
pwd = models.CharField(max_length=64)
class UserToken(models.Model):
user = models.OneToOneField(to="UserInfo")
token = models.CharField(max_length=64)
############### 登陸認證 ################
from rest_framework.views import APIView
from rest_framework.response import Response
from django.shortcuts import HttpResponse
from api import models
import uuid
class AuthView(APIView):
def post(self,request,*args,**kwargs):
"""
用戶登錄認證
:param request:
:param args:
:param kwargs:
:return:
"""
ret = {'code':1000}
user = request.data.get('user')
pwd = request.data.get('pwd')
user = models.UserInfo.objects.filter(user=user,pwd=pwd).first()
if not user:
ret['code'] = 1001
ret['error'] = '用戶名或密碼錯誤'
else:
uid = str(uuid.uuid4())
models.UserToken.objects.update_or_create(user=user,defaults={'token':uid})
ret['token'] = uid
return Response(ret)
############### 訪問接口的認證類 ################
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from api import models
class LuffyAuth(BaseAuthentication):
def authenticate(self, request):
"""
認證,需要獲取前端傳遞的token,并且校驗是否存在,
:param request:
:return:
"""
token = request.query_params.get('token')
obj = models.UserToken.objects.filter(token=token).first()
if not obj:
raise AuthenticationFailed({'code':1001,'error':'認證失敗'})
return (obj.user.user,obj) # 認證成功返回一個元組,
############### 視圖認證舉例 ################
class MicroView(APIView):
# 認證
authentication_classes = [LuffyAuth,]
def get(self,request,*args,**kwargs):
ret = {'code':1000,'title':'微職位'}
return Response(ret)
############### 表結構 ################
總結
以上是生活随笔為你收集整理的路飞学城项目-登陆认证模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蒸内脂豆腐怎样做好吃
- 下一篇: 喉咙有痰挂什么科