深入解析前后端分离组件django-rest_framework IV

简介: 深入解析前后端分离组件django-rest_framework IV

解析器


request类


django的request类和rest-framework的request类的源码解析


局部视图


from rest_framework.parsers import JSONParser,FormParser
class PublishViewSet(generics.ListCreateAPIView):
    parser_classes = [FormParser,JSONParser]
    queryset = Publish.objects.all()
    serializer_class = PublshSerializers
    def post(self, request, *args, **kwargs):
        print("request.data",request.data)
        return self.create(request, *args, **kwargs)


全局视图


REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
    "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
    "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",],
    "DEFAULT_THROTTLE_RATES":{
        "visit_rate":"5/m",
    },
    "DEFAULT_PARSER_CLASSES":['rest_framework.parsers.FormParser',]
}


备注:局部使用指定解析器时,只需在视图类中添加一个变量:parser_classes = […]

rest_framework全局默认使用的解析器:


DEFAULTS = {
    # Base API policies
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser'
    ),


分页


简单分页


from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination
class PNPagination(PageNumberPagination):
        page_size = 1     # 每页显示的数据个数
        page_query_param = 'page'    #翻页的参数  ?page=num
        page_size_query_param = "size"    #每页临时显示的数据个数  覆盖page_size
        max_page_size = 5     #每页允许显示的最大条数
class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializers
    def list(self,request,*args,**kwargs):
     # 单写某个视图时的用法
        book_list=Book.objects.all()
        pp=LimitOffsetPagination()
        pager_books=pp.paginate_queryset(queryset=book_list,request=request,view=self)
        print(pager_books)
        bs=BookSerializers(pager_books,many=True)
        #return Response(bs.data)
        return pp.get_paginated_response(bs.data)


偏移分页


from rest_framework.pagination import LimitOffsetPagination


分页器在视图类中的用法:在视图类中定义一个变量:pagination_class=类

备注:使用LimitOffsetPagination偏移分页,里面的两个参数limit和offset:limit是每页显示的条数,offset是从第几条数据+1开始(offset=3,意为从第四条数据开始)。default_limit = num,默认显示的条数。


游标分页


from rest_framework.views import APIView
from .models import UserInfo
from rest_framework.response import Response
from rest_framework import serializers
from rest_framework.pagination import CursorPagination
class MyPagination(CursorPagination):
    # URL传入的游标参数
    cursor_query_param = 'cursor'
    # 默认每页显示的数据条数
    page_size = 2
    # URL传入的每页显示条数的参数
    page_size_query_param = 'page_size'
    # 每页显示数据最大条数
    max_page_size = 1000
    # 根据ID从大到小排列
    ordering = "id"
class PagerSerialize(serializers.ModelSerializer):
    '''数据序列化'''
    class Meta:
        model = UserInfo
        fields = "__all__"
        depth = 2     #用于显示关联字段的对应的表的详细内容
class PagerView(APIView):
    def get(self,request,*args,**kwargs):
        user_list=UserInfo.objects.all().order_by('-id')  #将数据按照id从大到小排序
        #根据url参数,获取分页数据
        obj=MyPagination()
        page_user_list=obj.paginate_queryset(user_list,request,self)
        #数据进行序列化
        ser=PagerSerialize(instance=page_user_list,many=True)
        response=obj.get_paginated_response(ser.data)  #返回带上下页连接的数据
        return response
        # return Response(ser.data)   #不含上下页链接


游标方式分页的本质是通过记住当前页面数据的最大、最小id,翻页时根据记录的最大或者最小id,查询下一页对应的数据,这样就不会出现每一次翻页都会重头遍历数据的情况,大大的提高了查询效率。缺点是无法直接跳转到某一页。


url路由器


我们在使用rest_framework时,url都是一个规定的格式,当我们有很多表时,意味着大量的复用一些代码,对于每一个模型表对应的url,只有两个地方不同,一个是路径的前缀,一个是对应的视图类。在rest_framework中也提供了一个url的分发,完美的解决了url的分发。


from rest_framework import routers


rest_framework提供一个routers的py文件,这个文件中包含跟路由相关的类。


使用方式:在routers.py中有一个DefaultRouter类,先实例化一个这个类的对象,router=routers.DefaultRouter(),通过这个router对象,可以将对应的路径和视图类注册:router.register(r"路径前缀",对应的视图类),最后只需将url(r'^', include(router.urls)),这个url加入到urlpatterns中即可。


备注:rest_framework中为我们提供了四种形式的访问方式:

  • books/
  • books/1/
  • books.json/
  • books/?format=json            后两种不常用



响应器


rest_framework默认提供给我们两种响应器:


DEFAULTS = {
    # Base API policies
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),


如果请求是浏览器,就用BrowsableAPIRenderer响应器返回一个页面,如果请求是非浏览器(比如Postman),就使用JSONRenderer响应一个json格式的数据。


rest_framework提供这两个响应器是为了利于开发。


我们可以在视图类中配置一个变量:renderer_classes = [JSONRenderer]


from rest_framework.renderers import JSONRenderer


这样我们再使用浏览器发送请求是,响应的是一个json格式的字符串,而不是一个界面。


版本控制


版本控制是由传入的客户端请求决定的,并且可能基于请求URL,或者基于请求头。


restframework也提供了对应的版本控制。当使用版本控制时,request.version属性(字符串)与客户端请求的版本一致。 默认情况下,没有使用版本控制,request.version将会返回None,我们可以通过request.version的值进行判断和逻辑分发.


基于请求url


class APIView(View):
    # 版本控制的默认配置    可以在局部中定义versoning_class=的自定义配置
    versioning_class = api_settings.DEFAULT_VERSIONING_CLASS
     def initial(self, request, *args, **kwargs):
        #  版本控制相关
        # Determine the API version, if versioning is in use.
        version, scheme = self.determine_version(request, *args, **kwargs)
        request.version, request.versioning_scheme = version, scheme


全局配置


  1. 添加配置
REST_FRAMEWORK = {
             ....
'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
             'ALLOWED_VERSIONS':['v1','v2'], # 允许的版本
             'VERSION_PARAM':'version', # 参数
             'DEFAULT_VERSION':'v1', # 默认版本
             ....
      }


  1. 设置路由
BeesCity/urls.py
             urlpatterns = [
                    #url(r'^admin/', admin.site.urls),
                    url(r'^api/(?P<version>\w+)/', include('api.urls')),
             ]
      api/urls.py
             urlpatterns = [
                    url(r'^course/$', course.CourseView.as_view()),
             ]


  1. 传递版本信息
http://127.0.0.1:8000/api/v1/course/


  1. 获取版本


request.version 获取版本


局部配置


除非明确设置,否则DEFAULT_VERSIONING_CLASS值为None.此例中request.version将会始终返回None


您还可以在一个单独的视图上设置版本控制方案。通常,您不需要这样做,因为在全局范围内使用一个版本控制方案更有意义。如果您确实需要这样做,请使用versioning_class属性。


from rest_framework.versioning import QueryParameterVersioning
class Course(APIView):
    versioning_class = QueryParameterVersioning


这个时候可以用过url传参的方式来传递版本信息,如:


http://127.0.0.1:8000/api/course/?version=1


添加头信息控制版本


在API请求header中添加Accept字段。


Accept的作用是客户端指出响应可以接受的媒体类型


如Accept:application/json; version=v2


具体格式也可以参考下面。


Accept: application/vnd.xxxx[.version].param[+json]


例如Accept: application/vnd.demo.app-v2+json


总结


小版本的更新可通过把版本号作为参数的方式或者通过accept字段标示版本号的方式判断,大的版本更新则通过URL上添加版本号控制


目录
相关文章
|
存储 缓存 编解码
计算机硬件学习教程
【7月更文挑战第26天】
1164 2
|
大数据 物联网 云计算
认证故事|云涌云起,学无止境
云临城下,技术迭代。每一个在云海中遨游的人,都会面临着挑战,如何从“云里雾里”,找到前进的方向,做到“拨开云雾见青天”?笔者以实际学习阿里云的双认证经历(云acp+大数据acp),阐述给同路人关于面对挑战,坚持学习,沉淀积累的心路历程。
569 0
|
11天前
|
人工智能 自然语言处理 安全
阿里云千问办公 QwenWork详细介绍:产品核心能力、典型场景、价格及常见问题解答
千问办公是阿里云推出的一站式AI办公平台,主打"不止于对话,更注重交付",依托通义千问旗舰大模型,用户一句话即可完成数据分析、PPT生成、视频剪辑等复杂任务,直接输出可用成果。产品深度打通钉钉生态与企业OA,覆盖桌面端、网页端,提供企业标准版198元/人/月等多档订阅方案,新用户注册即赠2000积分,适配工程师、HR、财务等多职业办公场景,成为能动手干活的"全能AI同事"。
|
11天前
|
人工智能
千问办公官网入口:阿里AI办公QwenWork产品页和免费网页端链接
千问办公官网含两大入口:一是网页端(qwenwork.cn),即开即用,支持浏览器直接访问;二是阿里云产品页 https://t.aliyun.com/U/JNKJuO 提供免费/付费版详情、功能介绍及使用指南。
|
18天前
|
网络协议 Linux iOS开发
【2026实测】Wireshark下载+安装+汉化+使用教程(图文版,巨详细)
Wireshark 是一款免费开源的网络协议分析工具,可实时捕获、解析并可视化数据包,助你诊断网络故障、分析通信协议(如HTTP、DNS、TCP等)。支持Windows/macOS/Linux,含中文界面,新手入门便捷。(239字)
|
10天前
|
IDE 开发工具
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
Qoder国际版上线全新内置大模型Sonus(/ˈsoʊnəs/),全球领先,专精超长任务执行与电脑操作(Computer Use)。配合Qoder桌面端0.2.3版本,可自主完成编程、金融建模、科研及表格制作等复杂工作。现全面支持Qoder全系产品,效率提升3.2倍。
1185 8
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
|
12天前
|
人工智能 API 内存技术
刚刚 DeepSeek V4.1 Flash 开启内测,1 分钟教你用上!
刚刚 DeepSeek 内测群发布了 DeepSeek V4.1 Flash 中间版本内测的消息,这次的模型采用了新的结构,原生支持多模态、能力更强、速度更快、且成本更低。
1967 15
|
12天前
|
缓存 人工智能 自然语言处理
阿里云qwen3.8-flash大模型介绍:模型能力、模型价格、免费额度与最新活动
本文是阿里云百炼平台Qwen3.8-Flash大模型的选型接入指南,作为兼顾性能与响应速度的高性价比多模态模型,它支持百万级上下文窗口、全场景多模态输入与完整智能体能力矩阵,适配编程辅助、智能体协作等核心场景。文中同步梳理了最新下调的阶梯定价、夜间4折等优惠活动,搭配OpenAI兼容流式调用示例,帮助开发者低成本快速落地高并发AI应用。
阿里云qwen3.8-flash大模型介绍:模型能力、模型价格、免费额度与最新活动
|
17天前
|
人工智能 运维 BI
阿里云千问办公QwenWork深度解析:基于Qwen3.8,六大核心能力重构企业全自动化工作流与计费选型指南
传统AI办公工具大多停留在对话问答、文档摘要、简单文案生成层面,只能完成单点碎片化任务,无法自主拆解复杂业务流程,很难串联多工具、多文档、外部业务系统完成端到端完整工作交付。很多企业在落地AI办公的时候,需要组合多款不同工具,来回切换界面,手动复制粘贴中间结果,智能化改造落地门槛居高不下。千问办公QwenWork是整合多款智能体产品能力打造的一体化企业办公智能体平台,底层基座依托Qwen3.8大模型,打通桌面端Agent、云端Agent、企业协同Agent三种运行形态,不再局限简单问答,接收业务目标之后自主拆解任务步骤,调用各类工具,处理文档、表格、浏览器自动化、数据查询,直接输出可交付的办公
1680 4
|
18天前
|
缓存 数据可视化 开发工具
DeepSeek Harness 怎么更新?dsh 更新完整指南:更新本体(npx、npm、源码)与更新插件两种方式
DeepSeek Harness 的更新分两层:本体更新(npx 自动最新、npm update -g、源码 git pull)与插件更新(插件市场点更新、命令行覆盖安装)。本文按「准备 → 更新本体 → 更新插件 → 更新后检查」四步走,覆盖新手常见疑问。
1996 1
DeepSeek Harness 怎么更新?dsh 更新完整指南:更新本体(npx、npm、源码)与更新插件两种方式

热门文章

最新文章