Django Web框架要点之类视图

1.类视图

1.1 在django中类视图是用类来定义的一个视图
1.2类视图有什么优点
  • 1.2.1 想对于函数视图来说,虽然函数视图便于理解。但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳。
  • 1.2.2 类视图代码可读性好,类视图相对于函数视图有更高的复用性, 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可,十分契合大型项目的开发。

2. 创建类视图

  • 2.1 类视图
from django.views.generic import View

class RegisterView(View):
    """类视图:处理注册"""

    def get(self, request):
        """处理GET请求,返回注册页面"""
        return render(request, 'register.html')

    def post(self, request):
        """处理POST请求,实现注册逻辑"""
        return HttpResponse('这里实现注册逻辑')
  • 2.2 配置路由,使用类视图的as_view()方法来添加
urlpatterns = [
    # 视图函数:注册
    # url(r'^register/$', views.register, name='register'),
    # 类视图:注册
    url(r'^register/$', views.RegisterView.as_view(), name='register'),
]
  • 2.3 使用装饰器装饰类视图
  • 2.3.1 准备一个装饰器
def my_decorator(f):
    def wrapper(request, *args, **kwargs):
        print("装饰器被调用了")
        print('请求路径%s' % request.path)
        return f(request, *args, **kwargs)

    return wrapper


  • 2.3.2 装饰类视图的两种方法

在设计装饰器时基本都以函数视图作为考虑的被装饰对象
1.在url中配置装饰
此种方式最简单,但因装饰行为被放置到了url配置中
单看视图的时候无法知道此视图还被添加了装饰器,不利于代码的完整性,不建议使用。
此种方式会为类视图中的所有请求方法都加上装饰器行为,因为是在视图入口处,分发请求方式前
url(r'^register/', my_decorator(RegisterView.as_view()), name='register')

2.在类视图中装饰
需要注意的是,此中方法不能直接添加装饰,而是需要使用method_decorator将其转换为适用于类视图方法的装饰器
2.1 在类名位置使用的时候,还需要加上需要被使用的具体的请求方法的name
2.2 查看源码可以发现,如果我们复用父类的dispatch方法,直接给dispatch方法使用装饰器,相当于给所有的请求方法都加上装饰器

from django.utils.decorators import method_decorator

# @method_decorator(my_decorator, name='post')
@method_decorator(my_decorator, name='dispatch')
class RegisterView(View):
    """类视图,处理注册"""

    def get(self, request):
        """处理get请求,返回注册页面"""
        print(request.method)
        return HttpResponse('这是get请求方式返回的注册页面')

    # 2.3 还能直接在请求函数名上使用装饰器,此使用方法可以不需要指定具体的方法
    # @method_decorator(my_decorator)
    def post(self, request):
        """处理post请求,实现注册逻辑"""
        print(request.method)
        return HttpResponse('这是post请求方式下的注册逻辑页面')

    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)


  • 2.3.3 根据面向对象的多继承性,可以构造Mixin扩展类

让我们的视图类在继承View类的基础上,再继承此类,可以完成复用get方法

class MyDecoratorMixin(object):
    """Mixin扩展类"""

    def get(self, request):
        print(request.method)
        return HttpResponse('这是get请求方式下返回注册页面')


class RegisterView(MyDecoratorMixin, View):
    def post(self, request):
        print(request.method)
        return HttpResponse('这是post请求方式下的注册逻辑处理页面')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值