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 相关文章推荐
windows下python模拟鼠标点击和键盘输示例
Feb 28 Python
Python向日志输出中添加上下文信息
May 24 Python
python django 原生sql 获取数据的例子
Aug 14 Python
Python处理session的方法整理
Aug 29 Python
python 实现绘制整齐的表格
Nov 18 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
python isinstance函数用法详解
Feb 13 Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 Python
详解pytorch tensor和ndarray转换相关总结
Sep 03 Python
python 制作简单的音乐播放器
Nov 25 Python
详解非极大值抑制算法之Python实现
Jun 28 Python
python利用while求100内的整数和方式
Nov 07 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.MVC的模板标签系统(五)
2006/09/05 PHP
第十五节--Zend引擎的发展
2006/11/16 PHP
用PHP写的MySQL数据库用户认证系统代码
2007/03/22 PHP
PHP HTML代码串截取代码
2008/12/29 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
二级域名或跨域共享Cookies的实现方法
2008/08/07 Javascript
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
jQuery事件详解
2017/02/23 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
详谈js模块化规范
2017/07/07 Javascript
关于javascript sort()排序你可能忽略的一点理解
2017/07/18 Javascript
vue.js与element-ui实现菜单树形结构的解决方法
2018/04/21 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
python实现媒体播放器功能
2018/02/11 Python
Sanic框架路由用法实例分析
2018/07/16 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
类成员函数的重载、覆盖和隐藏区别
2016/01/27 面试题
信用社实习人员自我鉴定
2013/09/20 职场文书
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
生产经理的自我评价分享
2013/11/07 职场文书
工程力学硕士生的自我评价范文
2013/11/16 职场文书
社团活动总结报告
2014/06/27 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
使用CSS设置滚动条样式
2022/01/18 HTML / CSS