django-rest_framework组件
序列化组件
-Serializer
from rest_framework import serializer class BookSerializers(serializers.Serializer): title=serializers.CharField(max_length=32) authors=serializers.SerializerMethodField() def get_authors(self, obj): #自定制显示字段内容 obj为book对象 author = obj.authors.get() return author
-ModelSerializer
from rest_framework import ModelSerializer class BookSerializers(serializers.ModelSerializer): class Meta: model = models.Book fields = "__all__" #指定字段 # exclude=('nid',) 排除字段 不能跟fields同时用 depth = 1 #数据深度 def validate_title(self, value): #局部校验钩子 from rest_framework import exceptions raise exceptions.ValidationError('局部错误') return value def validate(self, attrs): #全局钩子 if attrs.get('title')== attrs.get('title2'): return attrs else: raise exceptions.ValidationError('全局')
#ModelSerializer方法
queryset.is_valid() #校验数据
queryset.save() #保存在数据库
-HyperlinkedModelSerializer
class ArticleHyperlinkedSerializer(serializers.HyperlinkedModelSerializer): source = serializers.HyperlinkedIdentityField(view_name='source-detail', lookup_field='source_id', lookup_url_kwarg='pk') #view_name指向视图名 lookup_field lookup_url_kwarg class Meta: model = models.Article fields = ["id", "type", "title", "source"] depth = 1 #路由 urlpatterns = [ url(r'source/(?P<pk>\d+)', views.SourceDetailView.as_view(), name='source-detail'), #视图别名name ] #视图 ser_obj = ArticleHyperlinkedSerializer(article_list, many=True, context={'request': request}) #context固定写法
视图组件ModelViewSet ViewSetMixin
#路由 url(r'^publish/$', views.PublishView.as_view({'get':'list','post':'create'})), url(r'^publish/(?P<pk>\d+)/$', views.PublishView.as_view({'get':'retrieve','put':'update','delete':'destroy'})) #视图 from rest_framework.viewsets import ModelViewSet class PublishView(ModelViewSet): queryset=models.Publish.objects.all() serializer_class=PublishSerializers HyperlinkedModelSerializer
认证组件
from rest_framework.authentication import BaseAuthentication class TokenAuth(BaseAuthentication): def authenticate(self, request): username = request.GET.get('username') token = request.GET.get('token') token_obj = models.UserToken.objects.filter(token=token).first() if token_obj: return username,token else: raise AuthenticationFailed('认证失败') def authenticate_header(self,request): pass #局部配置 class cla(APIView): authentication_classes = [TokenAuth, ] #全局配置 #setting文件中 REST_FRAMEWORK={ "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",] }
权限组件:
from rest_framework.permissions import BasePermission class UserPermission(BasePermission): def has_permission(self, request, view): user_type = request.user.user_type if user_type == 1: return True else: return False #局部配置 class cla(APIView): permission_classes = [UserPermission, ] #全局配置 #setting文件中 REST_FRAMEWORK={ "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",] }
频率组件
from rest_framework.throttling import SimpleRateThrottle class VisitThrottle(SimpleRateThrottle): scope = 'luffy' def get_cache_key(self, request, view): return self.get_ident(request) #局部配置 class cla(APIView): throttle_classes = [MyThrottles,] #全局配置 #setting文件中 REST_FRAMEWORK={ 'DEFAULT_THROTTLE_CLASSES':['app01.utils.VisitThrottle',], "DEFAULT_THROTTLE_RATES":{'luffy':'3/m'} }
分页器
#简单分页器 from rest_framework.pagination import PageNumberPagination class Mypage(PageNumberPagination): page_size = 2 page_query_param = 'page' # 定制传参 page_size_query_param = 'size' # 最大一页的数据 max_page_size = 5 class Pager(APIView): def get(self,request,*args,**kwargs): # 获取所有数据 ret=models.Book.objects.all() # 创建分页对象 page=Mypage() # 在数据库中获取分页的数据 page_list=page.paginate_queryset(ret,request,view=self) # 对分页进行序列化 ser=BookSerializer1(instance=page_list,many=True) # return Response(ser.data) # 这个也是返回Response对象,但是比基本的多了上一页,下一页,和总数据条数(了解即可) return page.get_paginated_response(ser.data) #配置 REST_FRAMEWORK = { # 每页显示两条 'PAGE_SIZE':2 } #偏移分页 from rest_framework.pagination import LimitOffsetPagination # 也可以自定制,同简单分页 class Pager(APIView): def get(self,request,*args,**kwargs): # 获取所有数据 ret=models.Book.objects.all() # 创建分页对象 page=LimitOffsetPagination() # 在数据库中获取分页的数据 page_list=page.paginate_queryset(ret,request,view=self) # 对分页进行序列化 ser=BookSerializer1(instance=page_list,many=True) # return page.get_paginated_response(ser.data) return Response(ser.data)
解析器/响应器
#解析器 限制允许接收的数据格式 #全局配置: REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES':[ 'rest_framework.parsers.JSONParser' json格式 'rest_framework.parsers.FormParser' urlencoded 格式 'rest_framework.parsers.MultiPartParser' form-data格式 ] } #局部使用 class cla(APIView): parser_classes = [JSONParser, ]
-响应器
http://127.0.0.1:8000/test/?format=json
http://127.0.0.1:8000/test.json
http://127.0.0.1:8000/test/
版本控制
from rest_framework.versioning import QueryParameterVersioning, AcceptHeaderVersioning, NamespaceVersioning, URLPathVersioning #基于url的get传参方式:QueryParameterVersioning------>如:/users?version=v1 #*****基于url的正则方式:URLPathVersioning------>/v1/users/ #局部使用 versioning_class = URLPathVersioning #全局使用 REST_FRAMEWORK = { 'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning', #选择哪个版本控制组件 'DEFAULT_VERSION': 'v1', #默认版本(从request对象里取不到,显示的默认值) 'ALLOWED_VERSIONS': ['v1', 'v2'], #允许的版本 'VERSION_PARAM': 'version' #URL中获取值的key }