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结果