视图和路由配置

频率:
		-自己定义:
			-定义一个大字典
			-请求来了,取出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')
posted @ 2018-12-17 15:16  不沉之月  阅读(154)  评论(0编辑  收藏  举报