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

相关推荐
岁月宁静3 分钟前
如何设计支持 Skills 的 Agent?一套可扩展的四层架构
python·agent
岁月宁静15 分钟前
CrewAI 快速上手:10 分钟搭建你的第一个 Agent 团队
python·agent
曲径海盗37 分钟前
【Python 学习第 40 天】for 循环
python·学习笔记·编程入门
专注仿真1 小时前
知识问答大模型-rag算法详解
人工智能·python·控制算法
染指11101 小时前
158.Agent-LangGraph-子图(共享状态和不共享状态模式)
开发语言·人工智能·python·ui·agent·agents
云和数据.ChenGuang3 小时前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节
xyouyuweizhu3 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
迪菲赫尔曼3 小时前
【基础篇 04】第一次使用终端:命令在哪里输入,电脑现在又“站”在哪里?
python·yolo·目标检测
qianbo_insist4 小时前
# 在 Qwen3.5-2B 上把 GDN-1 无损换成 GDN-2:一次完整的架构手术实验(负结果)
人工智能·pytorch·python·架构
专注仿真5 小时前
Agentic RAG算法详解
人工智能·python·大模型训练·控制算法