Rest Framework 實現登錄註冊
Django中提供了一個AbstractUser類,我們可以用來自由的定製我們需要的model
它裏面有寫好的username,password 等字段,如果有需要我們可以重寫,一般直接複用就好
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
tel=models.CharField(max_length=11)
class Meta:
db_table='user'
繼承AbstractUser需要在sttings裏配置:
AUTH_USER_MODEL='demo.User'
進行序列化serializers
from django.contrib.auth.hashers import make_password, check_password
from rest_framework import serializers
#註冊
class RegSerializers(serializers.ModelSerializer):
pwd2=serializers.CharField(max_length=256,min_length=4,write_only=True)
tel=serializers.CharField(max_length=11,min_length=11)
class Meta:
model=User
fields=('username','password','pwd2','tel')
def validate(self, attrs):
if attrs['pwd2']!=attrs['password']:
raise ValidationError('兩次密碼輸入不一致')
del attrs['pwd2']
#對密碼進行加密 make_password
attrs['password'] = make_password(attrs['password'])
return attrs
#登錄
class LogSerializers(serializers.ModelSerializer):
username=serializers.CharField(max_length=6)
class Meta:
model=User
fields=('username','password')
def validate(self, attrs):
user_obj=User.objects.filter(username=attrs['username']).first()
if user_obj:
#check_password 可以將加密後的密碼與輸入的密碼進行對比
if check_password(attrs['password'],user_obj.password):
return attrs
raise ValidationError('用戶名或密碼錯誤')
我們還可以添加Token 或者是手機驗證碼來讓賬號更安全
在views.py裏:
from rest_framework.viewsets import ModelViewSet
from .models import *
from .serializers import *
class RegList(ModelViewSet):
queryset = User.objects.all()
serializer_class = RegSerializers
def create(self, request, *args, **kwargs):
res=RegSerializers(data=request.data)
if res.is_valid():
res.save()
#res.errors 定義好的錯誤信息
return Response(res.errors)
class LogList(ModelViewSet):
queryset = User.objects.all()
serializer_class = LogSerializers
def create(self, request, *args, **kwargs):
data=request.data
res=LogSerializers(data=data)
if res.is_valid():
return Response(res.validated_data)
#res.errors 定義好的錯誤信息
return Response(res.errors)
我們繼承 ModelViewSet
URL
from django.conf.urls import url, include
from django.contrib import admin
from .views import *
from rest_framework.documentation import include_docs_urls
from rest_framework.routers import DefaultRouter
router=DefaultRouter()
router.register('reg',RegList,'reg')
router.register('log',LogList,'log')
urlpatterns = [
url(r'', include(router.urls)),
#創建API文檔
url(r'^api/', include_docs_urls(title='haha')),
]