昨天已经梳理了django中的FBV和CBV,今天开始梳理drf相关的内容。先从drf的使用开始梳理起走。
drf的初步使用
使用drf最基本要3个步骤:
- drf是django的一个包,所以在django项目中要先安装drf,安装的时候包的名字是
djangorestframework
。 - 在django的settings中要把它注册为一个app,注册app的名称叫做
rest_framework
- 在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.APIView
的as_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参数,得到的页面会不一样
