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参数,得到的页面会不一样

相关推荐
每日AI新事件1 小时前
python的异步函数
python
这里有鱼汤3 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook12 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室12 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三14 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试
用户25191624271117 小时前
Python之语言特点
python
刘立军17 小时前
使用pyHugeGraph查询HugeGraph图数据
python·graphql
数据智能老司机21 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构