Rest Framework 實現登錄註冊

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')),
	]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章