请求和响应
请求
def __init__(self, request, parsers=None, authenticators=None, negotiator=None, parser_context=None)
self._request = request
def __getattr__(self, item)
return getattr(self._request, item)
响应
def __init__(self, status=None, template_name=None, headers=None,
exception=False, content_type=None)
-from rest_framework import status 这个路径下, 它把所有的状态码都定义成立常量
- 局部使用: 对某个视图类有效
views.py中
from rest_framework.renderers import JSONRenderer
以及你不想渲染浏览器的类里面加上:
class TestView(APIView):
renderer_classes = [JSONRenderer,]
-----------------------------------------------
- 全局使用: 全局的视图类,所以请求, 都有效
- 在settings.py中加入如下
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
)
}
视图
APITView
GenericAPIView
基于APIView写接口 1.0
from rest_framework.generics import GenericAPIView
from app01.models import Book
from app01.ser import BookSerializer
class BookView(APIView):
def get(self, request):
book_list = Book.objects.all()
book_ser = BookSerializer(book_list, many=True)
return Response(book_ser.data)
def post(self, request):
book_ser = BookSerializer(data=request.data)
print(book_ser)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({
'status': 101,
'msg': '校验失败'
})
class BookDetailView(APIView):
def get(self, request, pk):
book_list = Book.objects.filter(pk=pk).first()
book_ser = BookSerializer(book_list)
return Response(book_ser.data)
def put(self, request, pk):
book = Book.objects.filter(pk=pk).first()
book_ser = BookSerializer(instance=book, data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({
'status': 101,
'msg': '校验失败'
})
def delete(self, request,pk):
Book.objects.filter(pk=pk).delete()
return Response({'status':1001, 'mag':'删除成功'})
class Book(models.Model):
name = models.CharField(max_length=32)
pirce = models.DecimalField(max_digits=5, decimal_places=2)
publish = models.CharField(max_length=32, default='23')
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
path('books/', views.BookView.as_view()),
re_path('books/(?P<pk>\d+)', views.BookDetailView.as_view()),
基于GenericAPIView写的接口 2.0
class Book2View(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request):
book_list = self.get_queryset()
book_ser = self.get_serializer(book_list, many=True)
return Response(book_ser.data)
def post(self, request):
book_ser = self.get_serializer(data=request.data)
print(book_ser)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({
'status': 101,
'msg': '校验失败'
})
class Book2DetailView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request, pk):
book_list = self.get_object()
book_ser = self.get_serializer(book_list)
return Response(book_ser.data)
def put(self, request, pk):
book = self.get_object()
book_ser = self.get_serializer(instance=book, data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({
'status': 101,
'msg': '校验失败'
})
def delete(self, request,pk):
self.get_object().delete()
return Response({'status':1001, 'mag':'删除成功'})
models.py 和 ser.py 和基于APIView写接口用的是同一个
path('books2/', views.Book2View.as_view()),
re_path('books2/(?P<pk>\d+)', views.Book2DetailView.as_view()),
基于GenericAPIView和5个视图扩展类写的接口 3.0
from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin
class Book3View(GenericAPIView, ListModelMixin, CreateModelMixin):
queryset = Book.objects
serializer_class = BookSerializer
def get(self, request):
return self.list(request)
def post(self, request):
return self.create(request)
class Book3DetailView(GenericAPIView, RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin):
queryset = Book.objects
serializer_class = BookSerializer
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)
path('books3/', views.Book3View.as_view()),
re_path('books3/(?P<pk>\d+)', views.Book3DetailView.as_view()),
基于GenericAPIView的视图子类 9个
from rest_framework.generics import CreateAPIView, ListAPIView, UpdateAPIView,RetrieveAPIView, DestroyAPIView, ListCreateAPIView, RetrieveUpdateDestroyAPIView
class Book4View(ListAPIView,CreateAPIView):
queryset = Book.objects
serializer_class = BookSerializer
class Book4DetailView(UpdateAPIView,RetrieveAPIView, DestroyAPIView):
queryset = Book.objects
serializer_class = BookSerializer
path('books4/', views.Book4View.as_view()),
re_path('books4/(?P<pk>\d+)', views.Book4DetailView.as_view()),
基于ModelViewSet编写5个接口
from rest_framework.viewsets import ModelViewSet
class Book5View(ModelViewSet):
queryset = Book.objects
serializer_class = BookSerializer
path('books5/', views.Book5View.as_view(actions={'get':'list', 'post':'create'})),
re_path('books5/(?P<pk>\d+)', views.Book5View.as_view(actions={'get':'retrieve', 'put':'update', 'delete':'destroy'})),