黑马程序员技术交流社区

标题: 【广州Python】Django类视图详解 [打印本页]

作者: xianqiuhua    时间: 2018-8-30 11:23
标题: 【广州Python】Django类视图详解
类视图引入
       以函数的形式进行定义的视图就是函数视图,视图函数便于理解,但是遇到一个视图函数对应的路径提供了多种不同的HTTP请求方式的支持时(get,post,delete,put),需要在一个函数中写不同的业务逻辑,代码的可读性和复用性就很底低,所以,我们引入类视图进行解决。
下面是视图函数的例子
[Python] 纯文本查看 复制代码
def register(request):
    """处理注册"""

    # 获取请求方法,判断是GET/POST请求
    if request.method == 'GET':
        # 处理GET请求,返回注册页面
        return render(request, 'register.html')
    else:
        # 处理POST请求,实现注册逻辑
        return HttpResponse('这里实现注册逻辑')

类视图的优点
       代码可读性好
       类视图相对于函数视图有更高的复用性,如果其他地方需要使用到某个类的某个特定方法,直接继承该类的视图就可以了
类视图的定义
根据不同的请求方式在类视图里面定义不同的处理函数
定义类视图需要继承自的Django提供的父类的View
[Python] 纯文本查看 复制代码
from django.views.generic import View


class DefineClassview(View):
    """演示类视图的定义和使用"""

    def get(self, request):
        """处理GET请求业务逻辑"""
        return HttpResponse('GET请求业务逻辑')

    def post(self, request):
        """处理POST请求业务逻辑"""
        return HttpResponse('POST请求业务逻辑')

    def put(self, request):
        """处理PUT请求业务逻辑"""
        return HttpResponse('PUT请求业务逻辑')

    def delete(self, request):
        """处理DELETE请求业务逻辑"""
        return HttpResponse('DELETE请求业务逻辑')

配置url:调用类视图的as_view()函数
注意:as_view() 函数继承于父类View
[Python] 纯文本查看 复制代码
urlpatterns = [
    # 视图函数:注册
    # url(r'^register/$', views.register, name='register'),
    # 类视图:注册  as_view()可以将类视图转换成视图,并决定如何分发请求
    url(r'^register/$', views.RegisterView.as_view(), name='register'),
]

类视图实现原理
通过下面源码,我们可以看到as_view() 函数里面的定义一个view() 函数,并且返回view。
我们再看view() 函数,里面调用了dispatch() 函数,dispatch() 函数的作用是按照不同请求方式调用不同请求方法。
[Python] 纯文本查看 复制代码
@classonlymethod
def as_view(cls, **initkwargs):
    """
    Main entry point for a request-response process.
    """
    ...省略代码...

    def view(request, *args, **kwargs):
        self = cls(**initkwargs)
        if hasattr(self, 'get') and not hasattr(self, 'head'):
            self.head = self.get
        self.request = request
        self.args = args
        self.kwargs = kwargs
        # 调用dispatch方法,按照不同请求方式调用不同请求方法
        return self.dispatch(request, *args, **kwargs)

    ...省略代码...

    # 返回真正的函数视图
    return view

def dispatch(self, request, *args, **kwargs):
    # Try to dispatch to the right method; if a method doesn't exist,
    # defer to the error handler. Also defer to the error handler if the
    # request method isn't on the approved list.
    if request.method.lower() in self.http_method_names:
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2