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编程开发之日期操作实例分析
Nov 13 Python
python实现折半查找和归并排序算法
Apr 14 Python
Python之str操作方法(详解)
Jun 19 Python
python使用opencv按一定间隔截取视频帧
Mar 06 Python
Python Numpy库datetime类型的处理详解
Jul 13 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
Python进程Multiprocessing模块原理解析
Feb 28 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
python 线程的五个状态
Sep 22 Python
python库sklearn常用操作
Aug 23 Python
Python matplotlib多个子图绘制整合
Apr 13 Python
python如何读取和存储dict()与.json格式文件
Jun 25 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
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
限制复选框的最大可选数
2006/07/01 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
jquery text()方法取标签中的文本
2014/07/25 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
jQuery遍历节点方法汇总(推荐)
2017/05/13 jQuery
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
python获取网页状态码示例
2014/03/30 Python
在Python中使用异步Socket编程性能测试
2014/06/25 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
对Python函数设计规范详解
2019/07/19 Python
Pycharm IDE的安装和使用教程详解
2020/04/30 Python
pycharm软件实现设置自动保存操作
2020/06/08 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
德国网上超市:myTime.de
2019/08/26 全球购物
大学生水文观测实习自我鉴定
2013/09/29 职场文书
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
导游实习生自荐书
2014/01/28 职场文书
倡议书范文
2014/04/16 职场文书
《画风》教学反思
2014/04/16 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书