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之传说中的函数编写条规
Oct 11 Python
Python实现过滤单个Android程序日志脚本分享
Jan 16 Python
Python通过select实现异步IO的方法
Jun 04 Python
详谈Python中列表list,元祖tuple和numpy中的array区别
Apr 18 Python
Python合并多个Excel数据的方法
Jul 16 Python
Python将文本去空格并保存到txt文件中的实例
Jul 24 Python
python and or用法详解
Jun 26 Python
pandas如何处理缺失值
Jul 31 Python
python deque模块简单使用代码实例
Mar 12 Python
django 实现手动存储文件到model的FileField
Mar 30 Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 Python
浅析python中特殊文件和特殊函数
Feb 24 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
Syphon 使用方法
2021/03/03 冲泡冲煮
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
php二维数组排序方法(array_multisort usort)
2013/12/25 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
一个高效的JavaScript压缩工具下载集合
2007/03/06 Javascript
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
js实现仿QQ秀换装效果的方法
2015/03/04 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
vue.js前后端数据交互之提交数据操作详解
2018/04/24 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
python爬取淘宝商品销量信息
2018/11/16 Python
详解python中的time和datetime的常用方法
2019/07/08 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
Maison Lab荷兰:名牌Outlet购物
2018/08/10 全球购物
.NET remoting中对象激活的两种方式
2015/06/08 面试题
Hibernate持久层技术
2013/12/16 面试题
英文推荐信格式范文
2014/05/09 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
法制工作总结2015
2015/07/23 职场文书
护理培训心得体会
2016/01/22 职场文书
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏