更新时间:2022-07-26 来源:黑马程序员 浏览量:
虽然一个视图处理用户的一个请求,但HTTP提供了多种请求方式(GET、POST、PUT等),用户使用应用的某个功能时,该功能可能以任意一种方式发起请求,例如商品管理功能使用GET方式发起的呈现商品列表的请求、使用POST方式发起的修改商品请求等。此时视图需要结合条件分支,对每种请求方式分别进行处理。然而,若所有请求方式的处理逻辑都定义在同一个视图中,视图很可能庞大且臃肿。为了解决这一问题,Django设计了类视图。
类视图允许在views.py的一个类中定义不同的方法,以处理同一功能以不同请求方式发送的请求。
假设有来自同一URL的GET请求和POST请求,以函数视图和类视图的形式分别组织代码,具体示例如下:
1.以函数的形式定义视图
from django.http import HttpResponse def my_view(request): if request.method == 'Get': return HttpResponse('Get result') elif request.method == 'POST': return HttpResponse('POST result')
2.以类的形式定义视图
# views.py from django.http import HttpResponse form django.views import View class MyView(View): def get(self, request): return HttpResponse('Get result') def post(self,request): return HttpResponse('POST result')
Django的URLconf期望将和请求关联的参数直接传递给可调用的函数而非定义了方法的类,所以URL配置中会调用视图类的as_view()方法。as_view()方法的功能是接收请求,获取请求方法request.method,并根据request.method返回相应的视图方法。
在urls.py中配置URL,调用以上定义的类视图,示例代码如下:
# urls.py from django.urls import path from views import MyView urlpatterns = [ path('about/', MyView.as_view()), ]
以上示例中的path()函数在接收到URL“about/”时,会调用MyView类的as_view()方法,根据不同的请求方式执行类视图MyView中的不同请求方法。