Django_类视图(五)

类视图优点

使用django的函数视图,如果要让同一个视图实现不同的请求方式实现不同的逻辑,就需要在脚本中使用条件语句进行判断。

这样使用起来没有问题,但是如果再实现put、delete等其它请求方式,在代码可读性就会很差。

使用django提供的类视图就可以解决这个问题。

类视图可以将对应的不同请求方式以类中的不同方法来区别定义。

使用方法

定义类视图

# 导入类视图基类
from django.views import View

class RegisterView(View):
    """注册的类视图"""
    def get(self, request):
        """get请求调用方法"""
        return render(request, "register.html", {'msg': '类视图被调用'})

    def post(self, request):
        """postq请求调用方法"""
        # 获取请求参数
        username = request.POST.get("user_name")
        pwd = request.POST.get("pwd")
        email = request.POST.get("email")
        allow = request.POST.get("allow")

        # 校验参数合法性
        if not all([username, pwd, email]):
            return render(request, 'register.html', {'msg': '数据不完整'})

        if "@" not in email:
            return render(request, 'register.html', {'msg': '邮箱格式错误'})

        if allow != "on":
            return render(request, 'register.html', {'msg': '请同意并勾选协议'})

        # 校验账户是否已被使用
        try:
            # 未获取到用户会抛出DoesNotExist异常
            User.objects.get(username=username)
            return render(request, 'register.html', {'msg': '用户名已存在'})
        except ObjectDoesNotExist:
            pass

        # 业务处理
        user = User()
        user.username = username
        user.password = pwd
        user.email = email
        user.is_active = 0
        user.save()

        # 返回响应数据
        return render(request, "register.html", {'msg': '注册成功'})

添加类视图路由

from django.urls import path
from . import views

# 定义命名空间
app_name = "user"

urlpatterns = [
    # path("register/", views.register, name="register"),
    path("register/", views.RegisterView.as_view(), name="register")    # 添加类视图路由
]

类视图原理

当路由配置的 views.RegisterView.as_view() 被执行时,调用如下方法

dispatch根据实例请求分发调用

类视图的二次封装

对类视图进行二次封装后,我们可以将路由、命名空间这些信息配置在类视图中

类视图二次封装代码如下

from django import urls
from django.views import View


class BaseView(View):
    path_type = "path"
    url = None
    name = None

    @classmethod
    def as_view(cls, **initkwargs):
        view = super(BaseView, cls).as_view()
        path = getattr(urls, cls.path_type)
        return path(cls.url, view, name=cls.name)

编写视图

# 导入封装的视图
from utils.base_view import BaseView


class DemoView(BaseView):
    path_type = "path"  # 使用path方法添加url
    url = "demotest/"
    name = "demo"       # 定义反向解析url的名称

    def get(self, request):
        return HttpResponse("hello python!")

配置路由

from apps.user.views import DemoView

urlpatterns = [
    DemoView.as_view()
]

访问url结果

 

posted @ 2020-11-01 11:03  码上测  阅读(226)  评论(0编辑  收藏  举报