DRF 的视图,路由和渲染器


1 视图

简单的增删改查 : ModelViewSet; 复杂的操作使用APIView 和 GenericViewSet

APIView(View)

class HomeView(APIView):
def get(self,request,*args,**kwargs):
user_list = UserInfo.objects.all()
ser = IndexSerializer(user_list,many=True)
return Response(ser.data)

GenericAPIView(APIView)

    注意 GenericAPIView 和 GenericViewSet 都需要    queryset = UserInfo.objects.all(); serializer_class = IndexSerializer 否则会报错

    class HomeView(GenericAPIView):
queryset = UserInfo.objects.all()
serializer_class = IndexSerializer
pagination_class = PageNumberPagination
def get(self,request,*args,**kwargs):
user_list = self.get_queryset()
p = self.paginator
page_user_list = p.paginate_queryset(queryset=user_list, request=request, view=self)
ser = IndexSerializer(page_user_list,many=True)
return p.get_paginated_response(ser.data)

GenericViewSet(ViewSetMixin, generics.GenericAPIView)

使用之后需要修改路由, 分发请求做不同的操作

    注意 GenericAPIView 和 GenericViewSet 都需要    queryset = UserInfo.objects.all(); serializer_class = IndexSerializer 否则会报错

    修改路由 url(r'^home/', HomeView.as_view({'get':'list','post':'create'}))
url(r'^home/(?P<id>\d+)', HomeView.as_view({'get':'retrieve'})) 修改视图的方法 class HomeView(GenericViewSet):
queryset = UserInfo.objects.all()
serializer_class = IndexSerializer
pagination_class = PageNumberPagination def list(self,request,*args,**kwargs):
..
def create():...
def retrieve():...

ModelViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet)

url(r'^home/$', HomeView.as_view({'get':'list','post':'create'}),name='home'),
url(r'^home/(?P<pk>\d+)$', HomeView.as_view({'get':'retrieve','put':'update','patch':'partial_update','delete':'destroy'})), class HomeViewSet(ModelViewSet):
queryset = UserInfo.objects.all()
serializer_class = IndexSerializer
pagination_class = PageNumberPagination # 不需要自定义方法 'get':'retrieve' == >> 权限的粒度 达到 单条对象级别,即单条数据 权限认证 check_object_permission

注意: GenericAPIView之后 , GenericViewSet ,ModelViewSet 内部都会检测 queryset和serializer_class,

都需要 queryset = UserInfo.objects.all(); serializer_class = IndexSerializer 否则会报错

2 路由

需要配置一套 .(?P\w+) 来请求不同的数据类型

自定义路由

from django.conf.urls import url, include
from web.views import s11_render urlpatterns = [
url(r'^test/$', s11_render.TestView.as_view()),
url(r'^test\.(?P<format>[a-z0-9]+)$', s11_render.TestView.as_view()),
url(r'^test/(?P<pk>[^/.]+)/$', s11_render.TestView.as_view()),
url(r'^test/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)$', s11_render.TestView.as_view())
] from rest_framework.views import APIView
from rest_framework.response import Response
from .. import models class TestView(APIView):
def get(self, request, *args, **kwargs):
print(kwargs)
print(self.renderer_classes)
return Response('...')

半自动路由

url(r'^home/$', HomeView.as_view({'get':'list','post':'create'}),name='home'),
url(r'^home/(?P<pk>\d+)$', HomeView.as_view({'get':'retrieve','put':'update','patch':'partial_update','delete':'destroy'})),
url(r'^home\.(?P<format>\w+)$', HomeView.as_view({'get':'list','post':'create'}),name='home'),
url(r'^home/(?P<pk>\d+)\.(?P<format>\w+)$', HomeView.as_view({'get':'retrieve','put':'update','patch':'partial_update','delete':'destroy'})),
] from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers
from .. import models class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
fields = "__all__" class UserViewSet(ModelViewSet):
queryset = models.UserInfo.objects.all()
serializer_class = UserSerializer

全自动路由

注意 serializer 需要使用 modelserailizer 全部字段

view 需要 viewset(对应不同的数据处理方式)

    from django.conf.urls import url, include
from rest_framework import routers
from web.views import UserViewSet router = routers.DefaultRouter()
router.register(r'users', UserViewSet) urlpatterns = [
url(r'^', include(router.urls)),
] from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers
from .. import models class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
fields = "__all__" class UserViewSet(ModelViewSet):
queryset = models.UserInfo.objects.all()
serializer_class = UserSerializer

3 渲染器

根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件

renderer_classes = [JSONRenderer,BrowsableAPIRenderer,AdminRenderer]

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

DRF 的视图,路由和渲染器的更多相关文章

  1. Django REST framework 之分页,视图,路由,渲染器

    1.分页 2.视图 3.路由 4.渲染器 1.分页 方法一: from django.shortcuts import render from rest_framework.versioning im ...

  2. Django Rest Framework(分页、视图、路由、渲染器)

    一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一页,不让选择页码,对页码进行加密 1.基于lim ...

  3. django的rest framework框架——分页、视图、路由、渲染器

    一.rest framework的分页 1.使用rest framework内置类PageNumberPagination实现分类 from django.conf.urls import url f ...

  4. rest_framework框架实现之(视图,路由,渲染器)

    一视图 一 在前面我们使用视图时继承的时APIview from rest_framework.response import Response from rest_framework.paginat ...

  5. Django:之Sitemap站点地图、通用视图和上下文渲染器

    Django中自带了sitemap框架,用来生成xml文件 Django sitemap演示: sitemap很重要,可以用来通知搜索引擎页面的地址,页面的重要性,帮助站点得到比较好的收录. 开启si ...

  6. DRF之频率限制、分页、解析器和渲染器

    一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...

  7. DRF频率、分页、解析器、渲染器

    DRF的频率 频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定 ...

  8. 【DRF解析器和渲染器】

    目录 解析器 Django中的解析器 DRF中的解析器 DRF中的渲染器 @ *** 解析器 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己想要的数据类型的过程. 本质就是对请求体中的 ...

  9. 07 Django REST Framework 解析器与渲染器

    01-解析器 REST 框架包括一些内置的Parser类,允许你接受各种媒体类型的请求.还支持定义自己的自定义解析器,这使你可以灵活地设计API接受的媒体类型. 注意: 开发客户端应用程序时应该始终记 ...

随机推荐

  1. .net截取字符串

    string s=abcdeabcdeabcdestring[] sArray1=s.Split(new char[3]{c,d,e}) ;foreach(string i in sArray1)Co ...

  2. Spark 1.5新特性介绍

    一.DataFrame执行后端优化(Tungsten第一阶段) DataFrame可以说是整个Spark项目最核心的部分,在1.5这个开发周期内最大的变化就是Tungsten项目的第一阶段已经完成.主 ...

  3. 配置数据库,Flask-Alchemy

    Flask-Alchemy连接数据库的插件 获取当前项目路径(绝对路径) 来自为知笔记(Wiz)

  4. PAT 天梯赛 L1-001 【水】

    L1-001. Hello World 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 这道超级简单的题目没有任何输入. 你只需要在一行中输 ...

  5. SVN更新的时候报断言失败解决办法

    解决办法:没啥好方法,重新检出代码就好使了.

  6. 【leetcode刷题笔记】Majority Element

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  7. CSS3飘带状3D菜单

    在线演示 本地下载

  8. 20145201《Java程序设计》第8周学习总结

    20145201 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章 通用API 15.1 日志 15.1.1 日志API简介 java.util.logging包提供了日志功 ...

  9. 解析JDK动态代理实现原理

    JDK动态代理使用实例 代理模式的类图如上.关于静态代理的示例网上有很多,在这里就不讲了. 因为本篇讲述要点是JDK动态代理的实现原理,直接从JDK动态代理实例开始. 首先是Subject接口类. p ...

  10. 《Maven实战》第6章 仓库

    6.1什么是Maven仓库? Maven仓库:存储所有Maven项目共享的构件的统一位置. Maven仓库的作用:Maven项目仅需声明依赖坐标,即可在需要的时候自动根据坐标找到仓库中的构件. 6.2 ...