URL定制、分页、渲染器

url定制和渲染器:

  渲染器:

  如果不对渲染器进行设置,默认使用常用url设置方式,浏览器端需要展示不同的渲染方式的数据时,需要在url地址上加上参数format,例如:

path(‘author/‘, views.AuthorView.as_view()),
class AuthorView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    queryset = models.Author.objects.all()
    serializer_class = serializers.AuthorSerializers

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

    http://127.0.0.1:8000/author/?format=json, 即显示json数据

    http://127.0.0.1:8000/author/?format=api, 即显示浏览器格式API

  

  url路径定制:

    定制后就能以url路径的形式访问不同的渲染器渲染后的数据:url路径参数名必须是format

re_path(‘^book\.(?P<format>[a-z0-9]+)$‘, views.BookUrlView.as_view())
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
class BookUrlView(APIView):
    # renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
    def get(self, request, *args, **kwargs):

        book_list = models.Book.objects.all()
        print(book_list)
        ser = serializers.BookSerializers(book_list, many=True, context={‘request‘: request})
        return Response(ser.data)

      http://127.0.0.1:8000/book.json

    http://127.0.0.1:8000/book.api

   他们的效果与上面是相同的,只是一种是基于url传参,一种是基于url路径

rest_framework默认使用两种渲染器:json和浏览器api

  还有其他几种渲染器:

    如果没定制url,配置这些渲染器后,就能这样访问,

      表格:http://127.0.0.1:8000/book?format=admin

      form表单:http://127.0.0.1:8000/book?format=form

      自定义显示模板:http://127.0.0.1:8000/book?format=html

    如果用定制了url路径:  

 re_path(‘^book\.(?P<format>[a-z0-9]+)$‘, views.BookUrlView.as_view())

      表格:http://127.0.0.1:8000/book.admin

      form表单:http://127.0.0.1:8000/book.form

      自定义显示模板:http://127.0.0.1:8000/book.html

总结:

  渲染器设置:

    1、默认使用json和浏览器api,可以在settings中设置为全局,局部设置类参数renderer_classes

class BookUrlView(APIView):
    # renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
    def get(self, request, *args, **kwargs):

        book_list = models.Book.objects.all()
        print(book_list)
        ser = serializers.BookSerializers(book_list, many=True, context={‘request‘: request})
        return Response(ser.data)

    2、如果同时多个存在渲染器时,自动根据URL后缀来选择渲染器。只有一个时,不用加后缀也能访问

  url路径定制:

    1、参数名必须是format

re_path(‘^book\.(?P<format>[a-z0-9]+)$‘, views.BookUrlView.as_view())

    2、可以手动,也可以全自动生成这些url,导入routers,创建DefaultRouter对象,将路径名与视图注册。

from django.conf.urls import url, include
from rest_framework import routers
from web.views import s10_generic

router = routers.DefaultRouter()
router.register(r‘users‘, s10_generic.UserViewSet)

urlpatterns = [
    url(r‘^‘, include(router.urls)),
    # url(r‘^v1/‘, include(router.urls)), # 区分版本
]

分页:

  rest_framework提供三种分页方式

    1、根据页码分页:PageNumberPagination

        page_size默认为None,可以自己在settings中配置,也可以继承这个类自定义一些属性

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

class MyPageNumberPagination(PageNumberPagination):
    page_size = 2  # 默认每页显示多少条
    page_query_param = ‘page‘  # 页码别名
    page_size_query_param = "max"   # 最多显示多少条 http://127.0.0.1:8000/book.api?page=1&max=5
    max_page_size = 5  # 最多显示多少条, 配合page_size_query_param使用

class BookUrlView(APIView):
    # renderer_classes = [JSONRenderer, BrowsableAPIRenderer]  # 渲染器
    def get(self, request, *args, **kwargs):

        book_list = models.Book.objects.all()
        page = MyPageNumberPagination()  # 创建分页对象
        page_book = page.paginate_queryset(book_list, request, view=self)  # 分页处理
        ser = serializers.BookSerializers(page_book, many=True, context={‘request‘: request})
        return Response(ser.data)

    2、根据位置和个数进行分页:LimitOffsetPagination

class MyLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 2  # 默认每页显示多少条
    limit_query_param = ‘limit‘  # URL中传入的显示数据条数的参数  http://127.0.0.1:8000/book.api?page=2&offset=5&limit=2
    offset_query_param = ‘offset‘  # URL中传入的数据位置的参数
    max_limit = None  # 最大每页显得条数

class BookUrlView(APIView):
    # renderer_classes = [JSONRenderer, BrowsableAPIRenderer]  # 渲染器
    def get(self, request, *args, **kwargs):

        book_list = models.Book.objects.all()
        page = MyLimitOffsetPagination()  # 创建分页对象
        page_book = page.paginate_queryset(book_list, request, view=self)  # 分页处理
        ser = serializers.BookSerializers(page_book, many=True, context={‘request‘: request})
        return Response(ser.data)

    3、游标分页:CursorPagination,页码进行了加密,需要自动生成url地址才能对上一页下一页方法

class MyCursorPagination(CursorPagination):
    cursor_query_param = ‘cursor‘   # URL传入的游标参数
    page_size = 2  # 默认每页显示的数据条数
    page_size_query_param = "max"   # URL传入的每页显示条数的参数
    max_page_size = 2  # 每页显示数据最大条数
    ordering = ‘id‘  # 根据ID从小到大排列
    # 根据ID从大到小排列
    # ordering = ‘-created‘

class BookUrlView(APIView):
    # renderer_classes = [JSONRenderer, BrowsableAPIRenderer]  # 渲染器
    def get(self, request, *args, **kwargs):

        book_list = models.Book.objects.all()
        page = MyPageNumberPagination()  # 创建分页对象

        page_book = page.paginate_queryset(book_list, request, view=self)  # 分页处理
        ser = serializers.BookSerializers(page_book, many=True, context={‘request‘: request})
        return page.get_paginated_response(ser.data)  # CursorPagination类的页码进行了加密,需要用这种显示上一页、下一页

    get_paginated_response会自动生成上一页和下一页的url地址,使用CursorPagination分页类必须用这种方法返回,否则自己无法生写访问上一页下一页的数据,它实际上是在response响应器上进行了封装,所以只需要将它返回即可,不需要再用响应器返回。

原文地址:https://www.cnblogs.com/aizhinong/p/12569172.html

时间: 2024-11-13 14:48:06

URL定制、分页、渲染器的相关文章

Swing-JTable的渲染器与编辑器使用demo

JTable的内容.外观.事件响应在很大程度上是由渲染器与编辑器控制的.具体说来,渲染器负责单元格的外观比如前景色.背景色,以及单元格提示:编辑器负责单元格的内容和事件响应.编辑器默认为文本框形式,也可以使用下拉菜单.按钮.单选按钮等形式.下面通过一个demo程序来说明渲染器与编辑器的基本用法. JButtonTableExample.java package JButtonTableExample; import java.awt.event.WindowAdapter; import jav

Django-RestFrameWork之分页 视图 路由 渲染器

目录 一.分页 二.视图 三.路由 四.渲染器 一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一页,不让选择页码,对页码进行加密 1.基于limit offset 做分页 from rest_framework.pagination import LimitOffsetPagination 1 urlpatterns = [ 2 url(r'^admin/', admin.site.urls)

Django Restful Framework【第五篇】分页、视图、路由、渲染器

一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一页,不让选择页码,对页码进行加密 1.基于limit offset 做分页 from rest_framework.pagination import LimitOffsetPagination urls.py urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app01/(?P<v

Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)

一.url控制 基本路由写法:最常用 from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^books/', views.Books.as_view()), url(r'^book/', views.Book.as_view()), url(r'^login/

python学习第九十九天:版本控制 渲染器 分页器

版本控制 版本控制: 方法一 1 127.0.0.1/course/?version=v100000 用from rest_framework.versioning import QueryParameterVersioning 在视图类里: versioning_class=QueryParameterVersioning(**不再是列表) 在setting里配置: REST_FRAMEWORK={ 'VERSION_PARAM':'version', 'DEFAULT_VERSION':'v

DRF 版本、认证、权限、限制、解析器和渲染器

目录 一.DRF之版本控制 为什么要有版本控制? DRF提供的版本控制方案 版本的使用 全局配置 局部配置(使用较少) 二.DRF之认证 内置的认证 步骤 三.DRF之权限 1.自定义一个权限类 2.权限 局部配置 3.权限 全局配置 四.DRF之限制 1.使用自定义限制类 1.1自定义一个限制类 1.2限制 局部配置 1.3限制 全局配置 2.使用内置限制类 2.1定义内置限制类 2.2全局配置 五.DRF之分页 1.为什么要使用分页 2.DRF使用分页器 2.1分页模式 2.2全局配置 2.

ZendFramework-2.4 源代码 - 关于MVC - View层 - 视图渲染器、视图插件管理器

<?php // 1. 视图渲染器 class PhpRenderer implements Renderer, TreeRendererInterface { /** * 插件管理器 */ public function getHelperPluginManager() { if (null === $this->__helpers) {// false $this->setHelperPluginManager(new HelperPluginManager()); } return

第21章 URL和Ajax辅助器方法

一.创建基本的链接和URL 视图最基本的任务之一是创建链接或URL,使用户能够随之进入应用程序的其他部分. 辅助器生成的链接或URL的好处是:输出来自路由配置,当路由发生改变全自动反映在链接和URL中. 渲染URL的HTML辅助器 描述 示例 输出 相对于应用程序的URL Url.Content("~/Content/Site.css") /Content/Site.css 链接到指定的动作控制器 Html.ActionLink("My Link", "I

Unity 5.4大赞:HTC Vive经典The lab渲染器开源

HTC Vive提供了一个不错的免费VR demo,最近1周仔细体验了一番. 仔细看了其安装文件,竟然是Unity 5.4beta版本(通过查log,知道Valve公司用的是最新的5.4.0b11版本开发的),的确令人信心大振: 要知道,某些创业公司为了打差异化竞争,提高技术门槛,对外称Unreal 4的画质比Unity 5优秀很多,这让很多在Unity技术栈下的公司有些郁闷–多年来Unity画质始终不如Unreal逼格高啊. The Lab 程序路径:Steam\steamapps\commo