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 15 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
浅谈python对象数据的读写权限
Sep 12 Python
详解python并发获取snmp信息及性能测试
Mar 27 Python
python中实现延时回调普通函数示例代码
Sep 08 Python
Python3操作SQL Server数据库(实例讲解)
Oct 21 Python
Python编程pygal绘图实例之XY线
Dec 09 Python
python3之模块psutil系统性能信息使用
May 30 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
python+numpy+matplotalib实现梯度下降法
Aug 31 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 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学习笔记 数组遍历实现代码
2011/06/09 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
再谈javascript 动态添加样式规则 W3C校检
2009/12/25 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
js+csss实现的一个带复选框的下拉框
2014/09/29 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
2017/06/02 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
ES6函数和数组用法实例分析
2020/05/23 Javascript
Vue中添加滚动事件设置的方法详解
2020/09/14 Javascript
python实现ip查询示例
2014/03/26 Python
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
python实现名片管理系统
2018/11/29 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
Django Rest framework频率原理与限制
2019/07/26 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
交通事故协议书范文
2014/04/16 职场文书
篮球比赛口号
2014/06/10 职场文书
委托书怎样写
2014/08/30 职场文书
法定代表人证明书
2014/11/28 职场文书
街道社区活动报告
2015/02/05 职场文书
经典祝酒词大全
2015/08/12 职场文书
个人向公司借款协议书
2016/03/19 职场文书
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL