什么是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技术站