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 相关文章推荐
在SAE上部署Python的Django框架的一些问题汇总
May 30 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
Python编程中归并排序算法的实现步骤详解
May 04 Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
python爬虫使用cookie登录详解
Dec 27 Python
基于Python开发chrome插件的方法分析
Jul 07 Python
Python 硬币兑换问题
Jul 29 Python
关于Django Models CharField 参数说明
Mar 31 Python
python根据字典的键来删除元素的方法
Aug 16 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
Jan 12 Python
OpenCV-Python实现轮廓的特征值
Jun 09 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实现的冒泡排序算法分享
2014/08/21 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
javascript function调用时的参数检测常用办法
2010/02/26 Javascript
用js实现的模拟jquery的animate自定义动画(2.5K)
2010/07/20 Javascript
js两行代码按指定格式输出日期时间
2011/10/21 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
vue使用nprogress加载路由进度条的方法
2020/06/04 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
Python中文件遍历的两种方法
2014/06/16 Python
python查询sqlite数据表的方法
2015/05/08 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
python+opencv识别图片中的圆形
2020/03/25 Python
python orm 框架中sqlalchemy用法实例详解
2020/02/02 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
数控技术专科生自我评价
2014/01/08 职场文书
2014信息公开实施方案
2014/02/22 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
如何用Python搭建gRPC服务
2021/06/30 Python
Python借助with语句实现代码段只执行有限次
2022/03/23 Python