django之rest_framework视图组件和路由配置,响应器

一,不是用组件内容,写五种方式

视图层:

from rest_framework.views import View, 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)
        print(bs.data)
        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 post(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()
            return JsonResponse(bs.data)
        else:
            return JsonResponse(bs.errors)

    def delete(self, request, pk):
        Publish.objects.filter(pk=pk).delete()
        return JsonResponse('')

路由配置

url(r'publish/$', views.PublishView.as_view()),
url(r'publish/(?P<pk>\d+)', views.PublishDetailView.as_view()),

序列化组件:

from rest_framework import serializers
from app01.models import *


class AuthorSerializer(serializers.ModelSerializer):
    nid = serializers.CharField()
    name = serializers.CharField()
    age = serializers.CharField()


class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        # fields = ['nid', 'name']
        fields = '__all__'


class PublishSerializers(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'

二,第一种方式(只把创建和查询的方式封装成两个类)

from rest_framework.views import View, APIView
from app01.models import *
from app01.mySer import *
from django.http import JsonResponse
class List:
    def list(self, request):
        queryset = self.queryset.all()
        print(queryset)
        bs = self.serializers(queryset, many=True)
        print(bs.data)
        return JsonResponse(bs.data, safe=False)


class Create:
    def create(self, request):
        print(request.data)
        bs = self.serializers(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
    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):
    # django内部设置的两个变量接口,直接调用赋值即可
    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 app01.mySer import *
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, \
    DestroyModelMixin
from rest_framework.generics import GenericAPIView
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

这是需要路由的匹配才能完成

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'})),

三,路由的配置(三种)

一种基本路由:url(r'^publish/$', views.PublishView.as_view()),

二,半自动路径(在类中必须继承ViewSetMixin,并且写在APIView前面):views.PublishView.as_view({'get': 'list', 'post': 'create'}))

三,全自动路由

路由配置的时候要写空,如果添加数据也是可以的,但是生成的路由都拼接在它后面

from rest_framework import routers
# 生成一个router对象
router=routers.DefaultRouter()
# 需要传两个参数,第一个参数就是匹配的路径,第二个参数,是视图类
router.register('publish',views.PublishView)		
url('', include(router.urls)),
#自动生成四个路由(PublishView必须继承ModelViewSet)

四,响应器

视图类中:
 

from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
renderer_classes=[JSONRenderer,BrowsableAPIRenderer]

在全局配置中:
 

REST_FRAMEWORK = {
		'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer']
	}
  •  内置渲染器
显示json格式:JSONRenderer

访问URL:

http://127.0.0.1:8000/test/?format=json
http://127.0.0.1:8000/test.json
http://127.0.0.1:8000/test/
 
默认显示格式:BrowsableAPIRenderer(可以修改它的html文件)

访问URL:

http://127.0.0.1:8000/test/?format=api
http://127.0.0.1:8000/test.api
http://127.0.0.1:8000/test/
 

表格方式:AdminRenderer

访问URL:

http://127.0.0.1:8000/test/?format=admin
http://127.0.0.1:8000/test.admin
http://127.0.0.1:8000/test/
 

form表单方式:HTMLFormRenderer

访问URL:

http://127.0.0.1:8000/test/?format=form
http://127.0.0.1:8000/test.form
http://127.0.0.1:8000/test/
  •  局部作用
renderer_classes = [HTMLFormRenderer,BrowsableAPIRenderer ]
  • 全局使用
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer']
}
  • 自定义显示模板
from rest_framework.renderers import  TemplateHTMLRenderer
class BookDetailView(APIView):
    renderer_classes = [TemplateHTMLRenderer]
    def get(self,request,pk):
        book_obj=models.Book.objects.filter(pk=pk).first()
        bs=BookSerializers(book_obj,many=False)
        return Response(bs.data,template_name='aa.html')
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ title }}
{{ publishDate }}
</body>
</html>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值