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

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

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

相关文章

  • 浅谈django model的get和filter方法的区别(必看篇)

    当我们使用Django进行开发时,经常会使用到Model的get和filter方法。两者都可以用来查询数据库中符合条件的数据,但是它们之间究竟有什么区别呢?下面对这个问题进行详细讲解。 一、Django中Model的get方法 get方法用于查询唯一的一条记录,它的使用方法如下: class ModelName(models.Model): field1 =…

    Django 2023年5月15日
    00
  • django + channels + layim 实现用户一对一,一对多,群组聊天实时通讯

      Django Channels介绍 首先要理解Django现有的请求响应策略是这样的:浏览器发出请求,Django服务器接受请求后通过路由匹配该请求到某个视图,视图将会返回一个响应并由服务器发送回浏览器。类似的请求响应在Flask实现也是如此。对于一般性的网页浏览(比如新闻阅读),这样的响应机制是没有问题的,但对于需要一个保持不断会话的请求来说,这是行不…

    Django 2023年4月13日
    00
  • Django-基本命令

    打开 Linux 或 MacOS 的 Terminal (终端)直接在 终端中输入这些命令(不是 python 的 shell中) 如果是 windows 用 cmd(开始 搜索 cmd 或者 快捷键 win + R,输入 cmd) 直接在 cmd 上操作。 1. 新建一个 django project django-admin.py startprojec…

    Django 2023年4月10日
    00
  • Python3创建django项目

    1,安装Python环境 2.在cmd命令行,用pip安装Djang。我用的Python3。所以pip3 install django 查看Django环境是否正常,引入包没有报错,说明环境正确: 3.在pycharm里创建Django项目   用命令行创建:     进入想要安置项目的目录,命令行输入:django-admin startproject m…

    2023年4月10日
    00
  • django 环境变量配置过程详解

    下面是关于“django 环境变量配置过程详解”的完整攻略: 什么是 Django 环境变量? 在开发 Django 项目时,我们需要进行一些环境变量的配置,这些环境变量通常包括数据库连接信息、邮件发送信息等。这些信息通常不方便直接写在代码中,因此我们需要将它们存储在环境变量中,便于项目管理、维护以及部署。 Django 环境变量配置的方法 方法一:使用 P…

    Django 2023年5月16日
    00
  • Django Sitemap 站点地图的实现方法

    实现网站地图是提高SEO的一种有效方法,而Django Sitemaps可以帮助我们快速实现。 以下是实现Django Sitemap站点地图的步骤: Step 1: 创建Sitemap子类 我们需要创建一个Sitemap子类,以便将模型与URL关联起来。例如,假设我们在网站上有一个名为Article的模型;那我们需要创建一个ArticleSitemap,并…

    Django 2023年5月16日
    00
  • django+uwsgi+daphne+supervisor生产环境部署

    一、前言   在上一篇文章中项目中使用了webscoket进行实时通讯,但是生产环境又使用了django+nginx+uwsgi的部署方式,我们都知道uwsgi并不能处理websocket请求,所以需要asgi服务器来处理websocket请求,官方推荐的asgi服务器是daphne,下面将介绍详细的部署步骤。   二、软件安装   之前已经写过一一篇关于d…

    Django 2023年4月16日
    00
  • 全面剖析Python的Django框架中的项目部署技巧

    全面剖析Python的Django框架中的项目部署技巧 简介 Django是Python最有名的web框架之一,提供了强大的ORM、模板引擎、路由等功能,被广泛应用于企业级应用和个人项目。在Django开发完成后,我们需要进行项目部署来进行生产环境的使用。本文将全面剖析Python的Django框架中的项目部署技巧。 准备工作 在进行Django项目的部署之…

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