drf初步梳理

昨天已经梳理了django中的FBV和CBV,今天开始梳理drf相关的内容。先从drf的使用开始梳理起走。

drf的初步使用

使用drf最基本要3个步骤:

  1. drf是django的一个包,所以在django项目中要先安装drf,安装的时候包的名字是djangorestframework
  2. 在django的settings中要把它注册为一个app,注册app的名称叫做rest_framework
  3. 在django的view中要导入它中的类。而drf这个包在django的site-packages中叫做rest_framework,所以导入的时候是导入的rest_framework,而rest_framework常用的类主要有两个,一个是rest_framework.views.APIView,一个是rest_framework.response.Response

用django的CBV和drf中的CBV对比着来看,先看项目的目录,依旧是上次那样,最基本的目录加一个名称叫做case01的APP。

markdown 复制代码
drf_study/$
├── apps/
│   └── case01/
├── drf_study/
│   ├── __pycache__/
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
└── requirements.tx

先在urls.py中把两个路由先写好。

python 复制代码
# drf_study/drf_study/urls.py

from django.urls import path  
from apps.case01 import views  
  
urlpatterns = [  
    path('info/', views.InfoView.as_view(), name='info'),               # 路由django的CBV  
    path('info_drf/', views.InfoDrfView.as_view(), name='info_drf'),    # 路由drf的CBV  
]

再在view.py中去写好两个类。

python 复制代码
# drf_study/apps/case01/views.py

from django.http import JsonResponse  
from django.views import View                   # 要用CBV,一定要导入这个类,所有的CBV中的C都继承自这个类  
from rest_framework.response import Response    # drf中的Response  
from rest_framework.views import APIView        # drf中的类都继承自APIView类  
  
# django中的类  
class InfoView(View):  
    def get(self, request):  
        context = {  
            'text': 'hello, this is info view by django CBV'  
        }  
        return JsonResponse(context)  
  
# drf中的类  
class InfoDrfView(APIView):  
    def get(self, request):  
        context = {  
            'drf_text': 'hello, this is drf_info view by django drf'  
        }  
        return Response(context)

可以看到它们俩使用上区别并不大,但是在展示上是有较大区别的。显著的区别就是drf的Response返回的是有一个样式的,这个样式上还有一些内容。

drf的路由到视图

之前我已经总结过了django的CBV中路由到视图的一个链路,它大概是这样一个顺序:自定义的类的as_view()->super().as_view()->View.as_view()->View.view()->自定义类的dispatch()->super().dispatch()->View.dispatch()->自定义类的.handler()

那在drf又是怎样的,我再来梳理一下。

首先drf中的APIView是继承自django.views.View的,也就是说比起在django中自定义一个类,使用drf继承类,多了一层APIView,而APIView中也没有as_view(),但是有dispatch(),以上面的info_drf路径为例,应该就是这样来走。

这里在rest_framework.views.APIViewas_view中返回的是csrf_exempt(view)是一个装饰器,让它不用经过django的csrf认证。

drf中的FBV

drf中也可以用FBV,只是需要在定义的函数上加上一个装饰器,api_view(['GET', 'POST']),在加上这个装饰器之前,需要先导入rest_framework.decorators.api_view

python 复制代码
# drf_study/drf_study/urls.py
from django.urls import path  
from apps.case01 import views  
  
urlpatterns = [  
    path('info/', views.InfoView.as_view(), name='info'),               # 路由django的CBV  
    path('info_drf/', views.InfoDrfView.as_view(), name='info_drf'),    # 路由drf的CBV  
    path('info_drf_fbv/', views.info_drf_fbv, name='info_drf_fbv'),    # 路由drf的FBV  
]
python 复制代码
# drf_study/apps/case01/views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view  # 要先导入装饰器,不然会报错

@api_view(['GET'])  
def info_drf_fbv(request):  
    context = {  
        'drf_text': 'hello, this is drf_info view by django drf FBV'  
    }  
    return Response(context)

先记录另外个现象,如果装饰器多加了一个POST参数,得到的页面会不一样

相关推荐
nvd1118 小时前
python异步编程 -协程的实际意义
开发语言·python
_安晓18 小时前
Rust 中精确大小迭代器(ExactSizeIterator)的深度解析与实践
java·前端·python
ayaya_mana18 小时前
CentOS 7/8/9 一键安装 Python 3.10+ 并配置默认版本
linux·python·centos
格兰芬多呼神护卫19 小时前
python实现Latex格式的公式转OMML并写入word
python·c#·word
ZPC821020 小时前
opencv 获取图像中物体的坐标值
人工智能·python·算法·机器人
测试199820 小时前
如何写出一个完整的测试用例?
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
微笑尅乐20 小时前
三种方法解开——力扣3370.仅含置位位的最小整数
python·算法·leetcode
多恩Stone21 小时前
【3DV 进阶-5】3D生成中 Inductive Bias (归纳偏置)的技术路线图
人工智能·python·算法·3d·aigc
闲人编程21 小时前
使用Python进行量化交易入门
开发语言·python·统计分析·lambda·量化·codecapsule