详解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中引入bootstrap的详细图文详解

    下面是Django中引入bootstrap的详细攻略和示例说明: 1. 安装Bootstrap 首先,我们需要安装Bootstrap。Bootstrap是一个开源的前端框架,提供了一系列易于使用的HTML、CSS和JavaScript库,可以快速构建美观的响应式网站和应用程序。 有很多种方法可以安装Bootstrap,例如从官方网站下载、使用CDN、使用NP…

    Django 2023年5月16日
    00
  • [Django]用户权限学习系列之设计自有权限管理系统设计思路

    若在阅读本片文章遇到权限操作问题,请查看本系列的前两章! http://www.cnblogs.com/CQ-LQJ/p/5609690.html和http://www.cnblogs.com/CQ-LQJ/p/5604331.html 现在步入正题,这篇文章是关于自有权限管理系统设计的思路描述,自有权限管理系统是抛弃django自带的后台管理界面,基于自己…

    2023年4月10日
    00
  • vue+django实现下载文件的示例

    当你在使用Vue.js 和 Django开发网站时,你经常会遇到需要用户下载文件的情况。下面是两个可以帮助你实现这个功能的示例: 示例一:Vue + Django 实现下载文件 Vue 部分 假设你在 Vue.js 2.x 中,首先你需要一个下载接口在 Vue 组件中: downloadFile() { const url = ‘http://example…

    Django 2023年5月16日
    00
  • Django实现文件上传下载功能

    下面我将为你详细讲解“Django实现文件上传下载功能”的完整攻略,包含以下两部分内容: 文件上传功能实现步骤 首先,在Django项目中创建一个文件上传的视图,可以在views.py中创建: from django.shortcuts import render from django.http import HttpResponse def upload…

    Django 2023年5月15日
    00
  • Django项目发布 环境部署(中)

    python环境部署 我们今天学习的内容是如何将Django项目部署到linux服务器上,我们部署的linux系统是centos7首先,我们先在linux上搭建我们的Python3环境: 在这里首先强调一下,Centos7系统自带的Python2我们不要删除,我们要做的是在Python2和python3并存。 1、  安装Python3的依赖包 2、  命令…

    2023年4月10日
    00
  • 【Django数据库】如何将一个表自定义的key列还原成id列作为key

    例如下表UserVerifyCode,自定义了idUser这个key     修改成如下,去掉idUer的主键属性   使用python manage.py makemigrations,id是新增列,不能为空,所以必须输入默认值     解决办法 Step1:清空表的数据 Step2:上图上选择1方法,输入int(0) Step3: id列我们的都知道,实…

    Django 2023年4月13日
    00
  • Python 学习笔记13:Python + wsgi + django 配置。坑爹的python3和wsgi不兼容的解决

    今人不见古时月,今月曾经照古人。生命是如此的美丽与短暂! 学习Python已经两个月了,Python的语法通过做简单的语法题和看Python语法介绍,有了初步的了解。但上班还是要做别的事情,所以感觉学起来特别慢。有一种时不我待的感觉。   基本的语法了解了,接下来就要尽快进入到项目的实战。这样才能快速的遇到问题,并解决问题,迅速提升能力。 开始当然就是先按网…

    Django 2023年4月11日
    00
  • Pycharm创建Django项目示例实践

    下面为您详细讲解“Pycharm创建Django项目示例实践”的完整攻略。 Pycharm创建Django项目示例实践 环境准备 安装Python环境:首先需要安装最新版Python环境,可以去Python官网下载安装,安装完成后可以在命令行中输入python -V查看Python的版本,如果成功安装,会显示Python的版本号。 安装Pycharm:Pyc…

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