详解Django CBV基类View源码解析

yizhihongxing

什么是Django CBV?

Django CBV,即Django的基于类的视图(Class-based views),是Django框架中的一个重要组件之一。相比于FBV(函数视图),CBV更加面向对象,使得代码更加可复用、可维护、可扩展。CBV支持多种HTTP请求方法,如GET、POST、PUT、DELETE等。

Django CBV中的基类View

Django CBV中的基类View是所有CBV的基础,其他CBV都继承自View。View定于在django.views.generic.base中,它本身是个抽象类,不能直接实例化。View中定义了一些常用的属性和方法,常见的包括:

class View:
    http_method_names = ['get', 'post', 'put', 'delete', 'head', 'options', 'trace', 'patch']
    allowed_methods = None
    template_engine = None
    content_type = None

    @classonlymethod
    def as_view(cls, **initkwargs):
        ...

    def dispatch(self, request, *args, **kwargs):
        ...
  • http_method_names属性:表示允许的HTTP请求方法,包括get、post、put、delete、head、options、trace和patch。如果一个请求方法不在这个列表中,视图将返回HTTP405方法不允许。开发者还可以重写此属性以覆盖默认行为。

  • allowed_methods属性:允许处理的HTTP请求方法,这是一个字符串(用逗号分隔的方法名称),如果不为None,则视图将返回HTTP403禁止错误。如果开发者使用as_view()函数来构建视图函数,则可以通过allowed_methods参数来设置。

  • template_engine属性:表示要使用的模板引擎。默认情况下是None,表示使用Django的template框架。开发者还可以重写此属性以使用自己的模板引擎。

  • content_type属性:表示响应的Content-Type类型。开发者可以重写此属性来指定响应类型。默认情况下是None,表示Django会自动判断响应的类型。

  • as_view()方法:将类视图转换为可调用的视图函数,并返回该函数。as_view()中的**initkwargs允许开发者传递额外的参数到视图函数中。

  • dispatch()方法:是Django CBV的核心。它根据请求方法(request.method)调用类视图中的不同方法(get()、post()、put()等)。如果请求的方法不是允许的,会返回HTTP405方法不允许错误。如果继承的类重写了dispatch()函数,则可以自定义它的处理方式。

View的as_view()方法

View中的as_view()方法是Django CBV的核心。它将类视图转换为可调用的视图函数,并返回该函数。开发者可以直接将这个函数作为URL的视图函数,例如:path('myview/', MyView.as_view())。as_view()方法中的**initkwargs允许开发者传递额外的参数到视图函数中。示例代码如下:

from django.views.generic import View

class MyView(View):
    def get(self, request, *args, **kwargs):
        context = {
            'key': 'value',
        }
        return render(request, 'my_template.html', context)

myview = MyView.as_view()

View的dispatch()方法

View中的dispatch()方法是Django CBV的核心。它根据请求方法(request.method)调用类视图中的不同方法(get()、post()、put()等)。如果请求的方法不是允许的,会返回HTTP405方法不允许错误。如果继承的类重写了dispatch()函数,则可以自定义它的处理方式。示例代码如下:

from django.views.generic import View

class MyView(View):
    def get(self, request, *args, **kwargs):
        context = {
            'key': 'value',
        }
        return render(request, 'my_template.html', context)

    def post(self, request, *args, **kwargs):
        data = request.POST
        ...
        return redirect('success')

    def dispatch(self, request, *args, **kwargs):
        if request.method == 'GET':
            return self.get(request, *args, **kwargs)
        elif request.method == 'POST':
            return self.post(request, *args, **kwargs)
        else:
            return HttpResponseNotAllowed(self.http_method_names)

View的使用

View是Django CBV中最基本的类,例如:

from django.views.generic import View

class MyView(View):
    def get(self, request, *args, **kwargs):
        context = {
            'key': 'value',
        }
        return render(request, 'my_template.html', context)

该类定义一个get()方法,处理GET请求,并返回渲染后的模板。

总结

Django CBV中的基类View是所有CBV的基础,其他CBV都继承自View。View中定义了一些常用的属性和方法,包括http_method_names、allowed_methods、template_engine、as_view()和dispatch()等。

as_view()方法将类视图转换为可调用的视图函数,并返回该函数。dispatch()方法根据请求方法(request.method)调用类视图中的不同方法(get()、post()、put()等)。

如果请求的方法不是允许的,会返回HTTP405方法不允许错误。View的使用非常简单,开发者只需根据请求方法编写对应的方法即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Django CBV基类View源码解析 - Python技术站

(0)
上一篇 2023年3月12日
下一篇 2023年3月12日

相关文章

  • web之django的序列化器汇总

      django的rest_framework的一大特色是序列化器,其封装了视图中关于用户请求,验证及响应数据的处理部分,使得程序简洁化。此DRF框架中将数据模型对象转化为json、xml等可传输或存档的格式的过程称为序列化,反之称为反序列化。序列化器是专注于此类行为的类,有自定义序列化器,模型类序列化器,视图集合三类。 1.视图函数 2.类视图   1.自…

    Django 2023年4月12日
    00
  • 简单介绍django提供的加密算法

    下面是详细讲解“简单介绍django提供的加密算法”的攻略: 介绍 Django 是一个使用 Python 编写的全栈框架,其中提供了多种加密算法,用于保护用户的敏感信息,例如密码、会话数据等。 在 Django 中,加密算法通常使用在以下两个方面: 存储密码时的加密:如何保护用户的密码,并在需要时验证其正确性。 生成加密令牌:如何向用户发送一个加密的令牌,…

    Django 2023年5月16日
    00
  • django项目启动时报 ‘str’ object has no attribute ‘decode’

    今天在启动django项目是报错AttributeError: ‘str’ object has no attribute ‘decode’, 项目连接数据库时,出现这个错误,报错截图 处理过程:   点击最后一个报错信息,进入到下面这个页面    处理结果:   将上图用红色印记圈起来的代码直接注释掉,或者将代码里面的decode直接变为encode,这样…

    Django 2023年4月11日
    00
  • [django]django 3种返回json方法

    django 3种返回json方法 1.手动组装字典返回 from django.http import JsonResponse, HttpResponse from django.shortcuts import render from app01.models import Book # Create your views here. def get_…

    Django 2023年4月10日
    00
  • django-创建Template(模板)

    1、什么是Templates   1)、HTML文件   2)、使用lDTL–Django模板语言(Django Template Language)   3)、可以使用第三方模板(如Jinja2)–在setting中TEMPLATES中修改   2、Templates开发步骤: 在App(项目)的根目录下创建名叫Templates的目录 在该目录下创建…

    Django 2023年4月13日
    00
  • Django与数据库交互的实现

    针对您提出的问题,我将为您详细讲解Django如何与数据库交互的实现攻略。 一、Django与数据库 Django是由Python语言编写的一个高级Web框架。它是基于MVC架构设计的,有非常强大的ORM(Object Relational Mapper)功能和丰富的自带组件。Django支持多种数据库,主要包括: PostgreSQL MySQL SQLi…

    Django 2023年5月16日
    00
  • Django用户登录与注册系统的实现示例

    下面我将详细讲解“Django用户登录与注册系统的实现示例”的完整攻略,包含两条示例说明。 第一条示例:创建Django项目并实现用户登录 1. 创建Django项目并配置数据库 首先我们需要创建一个Django项目,可以使用django-admin命令或者IDE自带的创建项目功能来创建。 然后,我们要配置数据库。在settings.py文件中,找到DATA…

    Django 2023年5月16日
    00
  • Django – 权限(2)- 动态显示单级权限菜单

    一、权限组件 1、上篇随笔中,我们只是设计好了权限控制的表结构,有三个模型,五张表,两个多对多关系,并且简单实现了对用户的权限控制,我们会发现那样写有一个问题,就是权限控制写死在了项目中,并且没有实现与我们的业务逻辑解耦,当其他项目要使用权限控制时,要再重复写一遍权限控制的代码,因此我们很有必要将权限控制的功能开发成一个组件(可插拔)。   组件其实就是一个…

    Django 2023年4月10日
    00
合作推广
合作推广
分享本页
返回顶部