注册接口
项目初始化
settings.py
INSTALLED_APPS = [ # ... 'rest_framework', ] MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 自定义用户表 AUTH_USER_MODEL = 'api.User'
主 urls.py
from django.conf.urls import url, include from django.contrib import admin from django.views.static import serve from django.conf import settings urlpatterns = [ url(r'^admin/', admin.site.urls), # 路由分发 url(r'^api/', include('api.urls')), url(r'^media/(?P<path>).*', serve, {'document_root': settings.MEDIA_ROOT}), ]
子 urls.py
from django.conf.urls import url, include from rest_framework.routers import SimpleRouter router = SimpleRouter() from . import views # 路由注册 # router.register('register', views.RegisterViewSet, 'register') urlpatterns = [ url('', include(router.urls)) ]
models.py
from django.contrib.auth.models import AbstractUser from django.db import models class User(AbstractUser): mobile = models.CharField(max_length=11, unique=True, verbose_name='移动电话') icon = models.ImageField(upload_to='icon', default='icon/default.png', verbose_name='头像') class Meta: db_table = 'o_user' verbose_name_plural = '用户表' def __str__(self): return self.username class Book(models.Model): name = models.CharField(max_length=64, verbose_name='书名') class Meta: db_table = 'o_book' verbose_name_plural = '书表' def __str__(self): return self.name class Car(models.Model): name = models.CharField(max_length=64, verbose_name='车名') class Meta: db_table = 'o_car' verbose_name_plural = '车表' def __str__(self): return self.name
注册接口
urls.py
router.register('register', views.RegisterViewSet, 'register')
views.py
from rest_framework.viewsets import GenericViewSet, ModelViewSet from rest_framework import mixins from . import models, serializers class RegisterViewSet(GenericViewSet, mixins.CreateModelMixin): queryset = models.User.objects.filter(is_active=True).all() serializer_class = serializers.RegisterSerializer
serializers.py
from rest_framework import serializers from rest_framework.exceptions import ValidationError from . import models class RegisterSerializer(serializers.ModelSerializer): re_password = serializers.CharField(write_only=True, min_length=8, max_length=18) class Meta: model = models.User fields = ('username', 'password', 're_password', 'mobile') extra_kwargs = { 'password': { 'write_only': True, 'min_length': 8, 'max_length': 18 } } # username和mobile可以自定义局部钩子校验(省略) def validate(self, attrs): password = attrs.get('password') re_password = attrs.pop('re_password') if password != re_password: raise ValidationError({'re_password': 'password confirm error'}) return attrs # 需要重写create,创建用户需要密文 def create(self, validated_data): return models.User.objects.create_user(**validated_data)
用户中心接口
urls.py
router.register('user/center', views.UserCenterViewSet, 'center')
views.py
class UserCenterViewSet(GenericViewSet, mixins.RetrieveModelMixin): queryset = models.User.objects.filter(is_active=True).all() serializer_class = serializers.UserCenterSerializer
serializer.py
class UserCenterSerializer(serializers.ModelSerializer): class Meta: model = models.User fields = ('username', 'mobile', 'icon', 'email')
图书资源接口
urls.py
router.register('books', views.BookViewSet, 'book')
views.py
class BookViewSet(ModelViewSet): queryset = models.Book.objects.all() serializer_class = serializers.BookSerializer
serializers.pu
class BookSerializer(serializers.ModelSerializer): class Meta: model = models.Book fields = ('name', )