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

相关推荐
自学不成才1 天前
深度复盘:一次flutter应用基于内存取证的黑盒加密破解实录并完善算法推理助手
c++·python·算法·数据挖掘
徐先生 @_@|||1 天前
Palantir Foundry 五层架构模型详解
开发语言·python·深度学习·算法·机器学习·架构
深蓝电商API1 天前
Scrapy爬虫限速与并发控制最佳实践
爬虫·python·scrapy
Derrick__11 天前
淘宝MD5爬虫
爬虫·python
薛定谔的猫19821 天前
llama-index Embedding 落地到 RAG 系统
开发语言·人工智能·python·llama-index
nimadan121 天前
**手机小说扫榜工具2025推荐,精准追踪榜单动态与题材风向
python·智能手机
编程武士1 天前
Python 各版本主要变化速览
开发语言·python
傻啦嘿哟1 天前
Python中的@property:优雅控制类成员访问的魔法
前端·数据库·python
sky17201 天前
VectorStoreRetriever 三种搜索类型
python·langchain
旦莫1 天前
Python测试开发工具库:日志脱敏工具(敏感信息自动屏蔽)
python·测试开发·自动化·ai测试