daphne報(bào)錯(cuò),很尷尬,查的時(shí)候發(fā)現(xiàn)另一個(gè)方案更符合需求
第一步:注冊(cè)認(rèn)證組件并配置
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework.authtoken',
...
]
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
)
...
}
注意:在settings.py中添加這個(gè)app后,它會(huì)幫我們?cè)跀?shù)據(jù)庫(kù)中生成一張authtoken表宁炫,所以我們要確保manage.py migrate在更改設(shè)置后運(yùn)行铸董。
第二步:設(shè)計(jì)登錄和登出的URL
from django.urls import path
urlpatterns = [
path('login', LoginView.as_view()),
path('logout', LogoutView.as_view()),
]
第三步:views類的編寫
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Response
from rest_framework.views import APIView
class LoginView(ObtainAuthToken):
def post(self, request, *args, **kwargs):
# 自定義返回結(jié)果的格式
ret = BaseResponse.BaseResponse()
# 從request中獲取數(shù)據(jù), 數(shù)據(jù)格式必須為 {"username":"用戶名","password":"密碼"}
serializer = self.serializer_class(data=request.data, context={'request': request})
if serializer.is_valid():
# 獲取user對(duì)象
user = serializer.validated_data['user']
# 每次用戶登錄時(shí)先刪除Token再重新生成Token
Token.objects.filter(user=user).delete()
# 生成新的Token
token, created = Token.objects.get_or_create(user=user)
# 自定義返回內(nèi)容
ret.msg = "登錄成功侧巨!"
ser_obj = UserProfileSerializer(user) # 編寫好User對(duì)象的序列化器
ret.data = ser_obj.data
ret.token = token.key
else:
# 登錄失敗時(shí)返回的內(nèi)容
ret.code = 1013
ret.msg = "登錄失敗!用戶名或密碼錯(cuò)诀紊!"
return Response(ret.dict)
class LogoutView(APIView):
queryset = UserProfile.objects.all()
def get(self, request):
ret = BaseResponse.BaseResponse()
try:
# 退出時(shí)刪除用戶登錄時(shí)生成的Token
Token.objects.filter(user=request.user).delete()
ret.msg = "退出成功眷蜈!"
except Exception as e:
ret.code = 1013
ret.msg = str(e)
return Response(ret.dict)
- BaseResponse類的代碼示例
class BaseResponse(object):
def __init__(self):
self.code = 1000
self.msg = ""
self.data = None
self.token = ""
@property
def dict(self):
return self.__dict__