详解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 logging日志配置 Django logging配置

      批注:做开发开不开日志,以下是我在工作中写Django项目常用的logging配置。 一个日志配置文件分为几个部分: (1)  定义日志的显示格式(formatters)==>> standard(标准版)、simple(简单版)、collect(收集版) (2)定义日志的过滤规则(filters) (3)日志流的处理方式(handlers)…

    Django 2023年4月13日
    00
  • Django Rest Framework之版本控制

    settings.py: REST_FRAMEWORK = { ‘DEFAULT_VERSION’: ‘v1’, # 默认版本 ‘ALLOWED_VERSIONS’: [‘v1’, ‘v2’], # 允许的版本 ‘VERSION_PARAM’: ‘version’ # URL中获取值的key }  urls.py: from django.conf.urls…

    2023年4月9日
    00
  • django-pymysql-封装的sql使用

    封装的sql import pymysql def get_list(sql,args): conn = pymysql.connect(host=’127.0.0.1′, port=3306, user=’root’, passwd=”, db=’s4db65′, charset=’utf8′) cursor = conn.cursor(cursor=p…

    Django 2023年4月13日
    00
  • Django admin美化插件suit使用示例

    下面为您详细讲解“Django admin美化插件suit使用示例”的完整攻略。该攻略包含两条示例说明。 美化Django Admin的插件suits Django Admin是Django默认自带的后台管理系统,功能强大,但是界面不够美观。为了让Django Admin变得更加优美,我们可以使用插件suits进行美化。 安装suits 我们可以通过pip安…

    Django 2023年5月16日
    00
  • Python的Django框架使用入门指引

    Python的Django框架使用入门指引 什么是Django Django是一个高级Web应用框架,使用Python编写。它帮助开发人员轻松地构建和维护复杂的Web应用程序。Django相对于其他Web框架的优势在于它的可扩展性,开发速度快和安全性高。 Django的安装 要安装Django,您需要安装Python。在安装Python之后,可以在命令行中使…

    Django 2023年5月16日
    00
  • Django Forms ChoiceField 选项更新问题

    今天使用django的forms,发现单选后台新增数据后,前端表单选项不能刷新 class UserForm(forms.Form): name = forms.ChoiceField( choices=User.objects.values_list(‘id’, ‘name’) ) 后台用户表新增一个用户     刷新表单页面,没有选择项    重启服务器…

    2023年4月10日
    00
  • django美化后台django-suit的安装配置操作

    下面我将为您详细讲解如何使用django-suit美化django后台管理界面: 安装django-suit 安装django-suit pip install django-suit 将django-suit添加到INSTALLED_APPS中: python INSTALLED_APPS = [ # … ‘suit’, # … ] 在settin…

    Django 2023年5月16日
    00
  • Django自定义Auth模块方式

    Django默认提供了认证系统Auth模块,认证的时候,会使用auth模块里面给提供的表。认证系统包含: 用户管理 权限 用户组 密码哈希系统 用户登录或内容显示的表单和视图 一个可插拔的后台系统 admin Django默认用户的认证机制依赖Session机制,在项目中将引入JWT认证机制,将用户的身份凭据存放在Token中,然后对接Django的认证系统…

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