django如何通过类视图使用装饰器


Posted in Python onJuly 24, 2019

需求:当我们想禁止ip黑名单访问我们的某些页面时,例如注册页面。应该怎么操作呢?

解决方案:这时候我们可以设计一个装饰器,过滤ip黑名单。

装饰器的写法如下:

from functools import wraps


def ban_ip(func):
 @wraps(func)
 def wrapper(request,*args,**kwargs):
 IP = request.META.get("REMOTE_ADDR")
 if IP in ["127.0.0.1"]: # 可以添加ip黑名单到列表里
  return HttpResponse("禁止访问")
 return func
 return wrapper

如果不是类视图,可以这样使用:

@ban_ip
def get_register(request):
 return render(request,"注册页面.html")


def post_resiger(request):
 name = request.POST.get("name")
 password = request.POST.get("password")
 print(name)
 print(password)
 return HttpResponse("注册成功")

这样就可以达到一个效果。如果ip在黑名单里,那么访问注册页面时会弹出“禁止访问”。

需求:但是,问题来了,当我们使用类视图时,定义视图函数时还有一个self参数。因为装饰器没有传这个参,所以会报错。应该怎么办呢?

解决办法:

(1)给类视图中特定的方法

class register(View):
 @method_decorator(ban_ip)
 def get(self,request):
 return render(request,"注册页面.html")

 def post(self,request):
 name = request.POST.get("name")
 password = request.POST.get("password")
 print(name)
 print(password)
 return HttpResponse("注册成功")

解读:

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

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

类视图的实现是通过as_view()这个方法来分发不同的请求来实现了。我们可以利用这点来给类视图的所有方法都应用装饰器。

一个比较简单但是不实用的办法就是在项目的urls.py上面来实现。在分发请求的前面加上装饰器。

url(r'^register$',ban_ip(views.register.as_view()))

虽然这样比较方便,但是太不美观了。装饰器的优雅都被它破坏了,那我们应该怎么办呢?

解决办法:把as_view()的方法重写一下,给它加入装饰器的功能。

class register(View):
 
 # 重写请求分发方法,as_view()的核心语句
 @method_decorator(ban_ip)
 def dispatch(self, request, *args, **kwargs):
 return super().dispatch(request, *args, **kwargs)

 def get(self,request):
 return render(request,"注册页面.html")

 def post(self,request):
 name = request.POST.get("name")
 password = request.POST.get("password")
 print(name)
 print(password)
 return HttpResponse("注册成功")

(3)对类视图的某个方法应用装饰器

@method_decorator(ban_ip,name='get')
class register(View):

 def get(self,request):
 return render(request,"post.html")

 def post(self,request):
 title = request.POST.get("title")
 content = request.POST.get("content")
 print(title)
 print(content)
 return HttpResponse("发布成功")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python判断图片宽度和高度后删除图片的方法
May 22 Python
快速入手Python字符编码
Aug 03 Python
pandas.DataFrame 根据条件新建列并赋值的方法
Apr 08 Python
Django 使用Ajax进行前后台交互的示例讲解
May 28 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
python 检查文件mime类型的方法
Dec 08 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
Aug 30 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
Feb 26 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 Python
详解python网络进程
Jun 15 Python
django 类视图的使用方法详解
Jul 24 #Python
django如何实现视图重定向
Jul 24 #Python
python字符串分割及字符串的一些常规方法
Jul 24 #Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 #Python
python 判断三个数字中的最大值实例代码
Jul 24 #Python
Django Celery异步任务队列的实现
Jul 24 #Python
python如何统计代码运行的时长
Jul 24 #Python
You might like
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
PHP经典实用正则表达式小结
2017/05/04 PHP
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
js 对小数加法精度处理示例说明
2013/12/27 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
jQuery选择器特殊字符与属性空格问题
2017/08/14 jQuery
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
浅析Django中关于session的使用
2019/12/30 Python
彻底解决Python包下载慢问题
2020/11/15 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
化工机械应届生求职信
2013/11/04 职场文书
体育老师的教学自我评价分享
2013/11/19 职场文书
乡镇干部十八大感言
2014/02/17 职场文书
小学生元旦感言
2014/02/26 职场文书
cf战队收人广告词
2014/03/14 职场文书
护理专业自荐书
2014/06/04 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
数据库之SQL技巧整理案例
2021/07/07 SQL Server
详解Vue的列表渲染
2021/11/20 Vue.js
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js