django 类视图

  • 类视图 实现

    • 以函数的方式定义的视图称为函数视图
    • 在Django中还可以通过类来定义一个视图,称为类视图
    • 类视图 的使用

      1. 定义一个类,继承Django提供的View

         from django.views.generic import View
        
         class PostView(View):
        
             def get(self, request):
                 """get请求: 显示发帖界面"""
                 return render(request, 'post2.html')
        
             def post(self, request):
                 """post请求: 执行发帖操作"""
                 # 代码简略
                 return HttpResponse('执行发帖操作')
        
      2. 调用类视图的 as_view() 方法配置url

         urlpatterns = [
             ...
             # 类视图注册
             url(r'^post2$', views.PostView.as_view()),
         ]
        
  • 类视图优点:对于函数视图代码可读性和复用性更好

视图中使用装饰器

一、在函数视图中使用装饰器

需求:实现禁止ip黑名单访问发帖界面。 解决:可以通过在视图函数中使用装饰器实现,如下

  1. 为函数视图定义一个装饰器(在设计装饰器时,基本都以函数视图作为考虑的被装饰对象)

     def check_ip(view_fun):
         """装饰器:禁止黑名单ip访问"""
         def wrapper(request, *args, **kwargs):
             # 在视图函数执行前做额外的操作:
             # 禁止ip黑名单访问
             IP = request.META.get('REMOTE_ADDR')
             if IP in ['192.168.210.160']:
                 return HttpResponse('IP禁止访问')
             return view_fun(request, *args, **kwargs)
         return wrapper
    
  2. 给视图函数进行装饰

     @check_ip
     def post(request):
         """GET请求: 显示发帖界面"""
         return render(request, 'post.html')
    

    或者:也可以在URL中,通过方法调用的方式添加装饰器

     urlpatterns = [
         ...
         # 发帖功能
         url(r'^post$', check_ip(views.post))
     ]
    
    • 注意:这种添加装饰器的方式代码可读性差,不建议使用

 

二、类视图使用装饰器

(一)在路由中添加装饰器

类似如下,装饰器添加到路由中,则类视图中所有的方法都使用了装饰器,但可读性差,不建议使用。

urlpatterns = [
    ...
    # 发帖功能
    url(r'^post2$', check_ip(views.PostView.as_view()))
]

(二)在类视图的方法中添加

  • 注意:针对函数定义的装饰器,不能直接应用到类视图的方法中,因为少了一个self参数
  • 解决:可以使用method_decorator装饰器,为函数装饰器补充第一个self参数,使它可以应用到类的方法中。

(1) 给类视图的特定的方法添加装饰器:

class PostView(View):

    def get(self, request):
        return render(request, 'post2.html')

    @method_decorator(check_ip)
    def post(self, request):
        return HttpResponse('处理发帖操作')

(2)给类视图的所有方法应用装饰器:

class PostView(View):

    @method_decorator(check_ip)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self, request):
        return render(request, 'post2.html')

(3)另一种添加装饰器的方式:在类上面添加装饰器,指定对哪个方法进行装饰

@method_decorator(check_ip, name='get')
class PostView(View):

    def get(self, request):
        return render(request, 'post2.html')

    def post(self, request):
        return HttpResponse('处理发帖操作')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值