详解Django CBV基类View源码解析

什么是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的使用非常简单,开发者只需根据请求方法编写对应的方法即可。

此文章发布者为:Python技术站作者[metahuber],转载请注明出处:http://pythonjishu.com/django-cbv-view/

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年 3月 12日 下午10:02
下一篇 2023年 3月 12日 下午10:04

相关推荐

  • Django url标签详解

    Django中提供了一个url标签,它可以用于生成URL,这对于模板中的链接很有用。url标签可以帮助我们在模板中对应用程序中的视图进行链接,因此我们可以展示数据无需手动构建URL。 url语法: {% url 'url_name' arg1 arg2 … %} url_name: URLconf中定义的名称(或视图)。 arg1, …

    Django 2023年 3月 12日
    00
  • 详解Django中Cookie和Session

    Cookie和Session简介 Web应用程序中的Cookie和Session是非常重要的概念。它们是用来跟踪用户状态和提高用户访问体验的重要方式。 在Django中,Cookie和Session都是默认开启的。这两个功能可以用于记录用户的登录状态、跟踪用户的浏览历史和购物车等数据。Cookie和Session的区别在于,Cookie存储在用户的浏览器中,…

    Django 2023年 3月 12日
    00
  • Django模板标签完整攻略(详解版)

    Django模板标签是用于在模板中动态地展示或操作数据的一种方式。Django自带了许多标签,如 {% if %}、{% for %}、{% url %}等,同时也支持自定义标签。下面详细介绍Django模板标签的语法和用法。 模板标签语法 Django模板标签以“{%”开头,“%}”结尾,如下所示: {% tag %} 其中,tag是标签的名称,具体使用方…

    Django 2023年 3月 13日
    00
  • Django查询数据库操作详解

    Django是一个高效的Web框架,它支持多种数据库的操作,包括MySQL、PgSQL、SQLite等。在Django中,查询数据库是一个很重要的操作,因为它是开发Web应用程序的基础。 接下来,我们将介绍Django查询数据库的详细过程和相关的代码示例。 创建数据库模型 首先,我们需要定义我们要查询的数据库模型。在Django中,模型是一个Python类,…

    Django 2023年 3月 12日
    00
  • Django聚合查询和分组查询

    聚合查询 聚合查询是对查询结果集进行某种特定的操作或者计算出某个值,例如对结果集求和、平均值、最大值、最小值等操作。在 Django 中,聚合查询的方法是使用 aggregate() 函数。 (1) 获得所有人的平均年龄 from django.db.models import Avg from yourapp.models import Person re…

    Django 2023年 3月 12日
    00
  • 详解Django视图函数

    Django是一个基于Python的Web框架,具有灵活性和高效性。在Django中,视图(views)是处理Web请求并返回Web响应的核心组件之一。本文将详细讲解Django视图函数的基本概念以及如何编写和使用Django视图函数。 概念 视图函数负责处理Web请求并生成Web响应。在Django中,一个视图函数通常会接收一个或多个HTTP请求,并返回一…

    Django 2023年 3月 11日
    00
  • 详解Django auth应用模块

    Django Auth应用模块是Django中用于处理认证和授权的模块,可以方便地为Django应用程序提供安全认证和授权机制。Django Auth应用模块是一个简单易用的Django插件,它包含了一些有用的API,例如User、Group、Permission等等。 Django Auth应用模块主要用于处理认证和授权,通过提供一些API函数,为Djan…

    Django 2023年 3月 13日
    00
  • Django Form表单完整使用流程

    Django Form表单提供了一种把一系列HTML元素和逻辑操作封装为Python对象的方式,用于从用户那里收集数据的任务。 它是Django Web框架的一部分,并且是Web开发中最重要的组件之一。本文将提供完整的Django Form表单的使用流程,包括Form类的创建、表单页面的渲染、数据的验证和处理、以及数据的保存。 以下是Django Form表…

    Django 2023年 3月 12日
    00
  • Django Admin后台管理系统是什么?如何使用?

    Django Admin后台管理系统是什么? Django是一个高级Web框架,提供了一系列组件和工具,帮助开发人员快速开发高质量的Web应用程序。 其中,Django Admin是Django框架的一个常用组件之一,提供了一个易于使用的后台管理系统,方便了用户管理数据和应用程序的操作。 简单来说,Django Admin后台管理系统就是一个Web应用程序的…

    2023年 3月 11日
    00
  • Django中的缓存机制及其实现方法

    什么是缓存? 简单来说,缓存就是将计算结果或数据存储到内存或其他更快存储介质中,以便后续请求快速访问,提高性能和响应速度。类似的概念常被用于Web框架和数据库中,用以优化性能和响应速度。 Django中的缓存机制 Django提供了多个缓存选择和多种缓存技术,包括内存缓存,数据库缓存,文件系统缓存等。Django默认使用的是基于内存的缓存,在Django的s…

    Django 2023年 3月 13日
    00