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使用opencv读取图片的实例
Aug 17 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
对Python中type打开文件的方式介绍
Apr 28 Python
python读取txt文件并取其某一列数据的示例
Feb 19 Python
Django对数据库进行添加与更新的例子
Jul 12 Python
python 处理微信对账单数据的实例代码
Jul 19 Python
python开头的coding设置方法
Aug 08 Python
Python OrderedDict的使用案例解析
Oct 25 Python
如何定义TensorFlow输入节点
Jan 23 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
windows安装python超详细图文教程
May 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
改进的IP计数器
2006/10/09 PHP
php 空格,换行,跳格使用说明
2009/12/18 PHP
php长字符串定义方法
2012/07/12 PHP
php中通过curl检测页面是否被百度收录
2013/09/27 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
jQuery操作Table技巧大汇总
2016/01/23 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
vue.js实现二级菜单效果
2019/10/19 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
常见的python正则用法实例讲解
2016/06/21 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
django 常用orm操作详解
2017/09/13 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
令人印象深刻的自荐信
2014/05/25 职场文书
社区护士演讲稿
2014/08/27 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
祝酒词范文
2015/08/12 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis