目录
类视图优点
使用方法
定义类视图
添加类视图路由
类视图原理
类视图的二次封装
类视图二次封装代码如下
编写视图
配置路由
访问url结果
源码等资料获取方法
类视图优点
使用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结果

源码等资料获取方法

各位想获取源码的朋友请点赞 + 评论 + 收藏,三连!
三连之后我会在评论区挨个私信发给你们~


















