Django REST Framework(二)Django的CBV

之前我们用的Django的视图函数叫FBV(也就是函数型视图函数),这里我们来试试CBV(类视图函数)的写法。类视图函数可以让代码看起来更简洁,用起来更方便。

CBV的简单使用

  • 视图类

    python 复制代码
    class BookView(View):
    
        def get(self, request):
            return HttpResponse("get请求book")
    
        def post(self, request):
            return HttpResponse("post请求book")
  • 路由:

    python 复制代码
    urlpatterns = [
        path('book/', views.BookView.as_view()),
    ]
  • postman测试get请求:

  • postman测试post请求:

CBV的源码解析

复制代码
##### 继承

```python
class Animal(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.sleep()  # 一定要明确self是谁

    def sleep(self):
        print("sleeping...")


class Dog(Animal):

    def wangwang(self):
        print("旺旺叫")

    def sleep(self):
        print("仰天睡...")


d = Dog("alex", 23)
```
复制代码
##### 反射

```python
class Animal(object):

    def __init__(self, name, age, init_func_str):
        self.name = name
        self.age = age

        func = getattr(self, init_func_str)
        func()

    def sleep(self):
        print("sleeping...")

class Dog(Animal):

    def wangwang(self):
        print("旺旺叫")

    def sleep(self):
        print("仰天睡...")


d = Dog("alex", 23, "sleep")
```
复制代码
#### CBV的源码解析

```python
''''
class BookView(View):

    def get(self, request):
        return HttpResponse("get请求book")

    def post(self, request):
        return HttpResponse("post请求book")
        
        
class View:
        @classonlymethod
        def as_view(cls):
    
            def view(request):
                self = cls()
                return self.dispatch(request, *args, **kwargs)
                
            return view
            
      def dispatch(self, request):
        
            handler = getattr(self, request.method.lower()) # 按请求方式分发       
            return handler(request, *args, **kwargs)

# 路由
path('book/', views.BookView.as_view()),
path('book/', View.view),

# 一旦用户发起请求,比如get请求访问/book/,得到的是get方法的响应结果

get请求访问/book/  =>  view()  =>   dispatch()  =>  get()  
''''
```
相关推荐
3gying43 分钟前
chromedriver
python
DES 仿真实践家2 小时前
【Day 11-N22】Python类(3)——Python的继承性、多继承、方法重写
开发语言·笔记·python
程序员张33 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
云泽野6 小时前
【Java|集合类】list遍历的6种方式
java·python·list
IMPYLH8 小时前
Python 的内置函数 reversed
笔记·python
程序员岳焱9 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
麦兜*9 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
大只鹅10 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
ai小鬼头10 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
小赖同学啊10 小时前
物联网数据安全区块链服务
开发语言·python·区块链