视图和路由配置
频率:
-自己定义:
-定义一个大字典
-请求来了,取出ip,
-判断ip是否在大字典中,如果不在,先插入到字典中,然后返回true
-如果在字典中,根据ip取出列表(时间列表,有顺序,最新的时间在最前面)
-while循环,判断当前时间,距离最后一条时间,是否大于60s,如果大于60s,pop掉(循环完成,内部没有60s以外的时间)
-判断列表长度,如果长度小于3,说明还可以访问,把当前时间,插到列表中的第一个位置,然后返回true
-判断列表长度,如果长度大于等于3,返回false
-内置频率访问的类
-写一个类继承
-scope='test'
-def get_cache_key(self, request, view):
#以什么做限制,就把什么返回
return self.get_ident(request)
-跟setting中对应
'DEFAULT_THROTTLE_RATES': {
'test': '10/m'
}
-局部使用:
throttle_classes = [MyThrottle,]
-全局使用:
在setting中配置
'DEFAULT_THROTTLE_CLASSES': ['app01.MyAuth.MyThrottle', ],
认证:
-认证类return的时候,返回值应该是两个或者是None
-认证失败,抛异常
-局部使用
-全局使用
权限:
-写一个权限类,如果权限认证成功,返回true,失败,返回false
-局部使用
-全局使用
序列化:
-写一个类,继承Serializer
-写一些属性
-text=CharField()
-source属性,可以传字段名,可以传方法(source指定的字段名不能跟前面字段名重复)
-aa=SerializerMethodField()
-写一个方法:get_字段名(self,对象)
-在方法内,通过orm查询其他表的数据
-返回什么,SerializerMethodField对应的字段,就能拿到什么
-使用:视图类
-生成一个序列化类的对象(instance,data,many)
-对象.data - 把对象,转成字典/列表
-数据校验保存功能
解析器:
-局部使用
-全局使用
要点:
视图
第一种:
-from rest_framework.mixins import ListModelMixin, CreateModelMixin
# class PublishView(GenericAPIView, ListModelMixin, CreateModelMixin):
# queryset = Publish.objects.all()
# serializer_class = PublishSerializers
#
# def get(self, request):
# return self.list(request)
#
# def post(self, request):
# # 添加一条数据
# return self.create(request)
第二种:
ListCreateAPIView 继承了GenericAPIView, ListModelMixin, CreateModelMixin
# class PublishView(GenericAPIView, ListModelMixin, CreateModelMixin):
# class PublishView(ListCreateAPIView):
# queryset = Publish.objects.all()
# serializer_class = PublishSerializers
第三种:
路由: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 = Publish.objects.all()
# serializer_class = PublishSerializers
最终:ViewSetMixin 它有什么作用?用了它之后,视图类中不需要写get,post,put方法了,自己定义方法就可以了
让请求方法对应到自己定义的方法上,配置路由
路由控制
三种:
-一种基本路由:url(r'^publish/$', views.PublishView.as_view()),
-半自动路径:views.PublishView.as_view({'get': 'list', 'post': 'create'}))
-必须继承:ViewSetMixin
-继承ViewSetMixin的先后顺序
-全自动路由:(基本不用)
-from rest_framework import routers
# 生成一个router对象
router=routers.DefaultRouter()
# 需要传两个参数,第一个参数就是匹配的路径,第二个参数,是视图类
router.register('publish',views.PublishView)
url('', include(router.urls)),
#自动生成四个路由(PublishView必须继承ModelViewSet)
响应器:(基本上不需要你配置)
局部配置
视图类中:
-renderer_classes=[JSONRenderer,BrowsableAPIRenderer]
全局配置
在setting中:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer']
}
代码示范
from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from app01.models import *
from app01.mySer import *
from django.http import JsonResponse
# class PublishView(APIView):
#
# def get(self, request):
# publish_list = Publish.objects.all()
# bs = PublishSerializers(publish_list, many=True)
#
# return JsonResponse(bs.data,safe=False)
#
# def post(self, request):
# # 添加一条数据
# print(request.data)
#
# bs = PublishSerializers(data=request.data)
# if bs.is_valid():
# bs.save() # 生成记录
# return JsonResponse(bs.data,safe=False)
# else:
#
# return JsonResponse(bs.errors,safe=False)
# class PublishDetailView(APIView):
# def get(self, request, pk):
# publish_obj = Publish.objects.filter(pk=pk).first()
# bs = PublishSerializers(publish_obj, many=False)
# return JsonResponse(bs.data,safe=False)
#
# def put(self, request, pk):
# publish_obj = Publish.objects.filter(pk=pk).first()
#
# bs = PublishSerializers(data=request.data, instance=publish_obj)
# if bs.is_valid():
# bs.save() # update
# return JsonResponse(bs.data)
# else:
# return JsonResponse(bs.errors)
#
# def delete(self, request, pk):
# Publish.objects.filter(pk=pk).delete()
#
# return JsonResponse("")
# 第一种方案
# class List:
# def list(self,request):
# queryset = self.queryset
# bs = self.serializers(queryset, many=True)
# return JsonResponse(bs.data,safe=False)
# class Create:
# def create(self,request):
# print(request.data)
#
# bs = PublishSerializers(data=request.data)
# if bs.is_valid():
# bs.save() # 生成记录
# return JsonResponse(bs.data,safe=False)
# else:
#
# return JsonResponse(bs.errors,safe=False)
# class PublishView(APIView,List,Create):
# queryset=Publish.objects.all()
# serializers=PublishSerializers
# def get(self, request):
# return self.list(request)
#
# def post(self, request):
# # 添加一条数据
# return self.create(request)
#
# class BookView(APIView,List,Create):
# queryset=Book.objects.all()
# serializers=BookSerializer
# def get(self, request):
# return self.list(request)
#
# def post(self, request):
# return self.create(request)
# 第二种方案 drf提供的封装的类
# from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, \
# DestroyModelMixin
# from rest_framework.generics import GenericAPIView
#
#
# class PublishView(GenericAPIView, ListModelMixin, CreateModelMixin):
# queryset = Publish.objects.all()
# serializer_class = PublishSerializers
#
# def get(self, request):
# return self.list(request)
#
# def post(self, request):
# # 添加一条数据
# return self.create(request)
#
#
# class PublishDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
# queryset = Publish.objects.all()
# serializer_class = PublishSerializers
#
# def get(self, request, pk):
# return self.retrieve(request, pk)
#
# def put(self, request, pk):
# return self.update(request, pk)
#
# def delete(self, request, pk):
# return self.destroy(request, pk)
#
# class BookView(GenericAPIView, ListModelMixin, CreateModelMixin):
# queryset = Book.objects.all()
# serializer_class = BookSerializer
#
# def get(self, request):
# return self.list(request)
#
# def post(self, request):
# # 添加一条数据
# return self.create(request)
from rest_framework.generics import ListCreateAPIView, ListAPIView, RetrieveUpdateDestroyAPIView
# 第三种方法:
# class PublishView(GenericAPIView, ListModelMixin, CreateModelMixin):
# class PublishView(ListCreateAPIView):
# queryset = Publish.objects.all()
# serializer_class = PublishSerializers
#
#
# class PublishDetailView(RetrieveUpdateDestroyAPIView):
# queryset = Publish.objects.all()
# serializer_class = PublishSerializers
# # 第四种方法:(不建议用)
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class PublishView(ModelViewSet):
# renderer_classes=[JSONRenderer,BrowsableAPIRenderer]
queryset = Publish.objects.all()
serializer_class = PublishSerializers
# from day100 import settings
# settings 就是项目的配置文件
from django.conf import settings
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
from rest_framework.response import Response
# 建议用魔法类ViewSetMixin
from django.conf import settings
from rest_framework.viewsets import ViewSetMixin
# 注意先后顺序,ViewSetMixin写在前面
class TestAll(ViewSetMixin,APIView):
def test(self,request):
print(settings.DEBUG)
return HttpResponse('test')
def test2(self, request):
return HttpResponse('test2')
def test3(self, request):
return HttpResponse('test3')