目录
类视图优点
使用方法
定义类视图
添加类视图路由
类视图原理
类视图的二次封装
类视图二次封装代码如下
编写视图
配置路由
访问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结果
源码等资料获取方法
各位想获取源码的朋友请点赞 + 评论 + 收藏,三连!
三连之后我会在评论区挨个私信发给你们~