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中的二叉树查找算法模块使用指南
Jul 04 Python
Python中条件判断语句的简单使用方法
Aug 21 Python
python实现红包裂变算法
Feb 16 Python
简单谈谈Python中的闭包
Nov 30 Python
Python 实现数据库更新脚本的生成方法
Jul 09 Python
Sanic框架请求与响应实例分析
Jul 16 Python
Python JSON编解码方式原理详解
Jan 20 Python
tensorflow 模型权重导出实例
Jan 24 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
Mar 24 Python
Python预测2020高考分数和录取情况
Jul 08 Python
python对输出的奇数偶数排序实例代码
Dec 04 Python
用python对oracle进行简单性能测试
Dec 05 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线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
学习php中的正则表达式
2014/08/17 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
Javascript miscellanea -display data real time, using window.status
2007/01/09 Javascript
我见过最全的个人js加解密功能页面
2007/12/12 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
jQuery控制TR显示隐藏的几种方法
2014/06/18 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
Python求解平方根的方法
2015/03/11 Python
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
使用python爬取B站千万级数据
2018/06/08 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
Python线程同步的实现代码
2018/10/03 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
Linux的文件类型
2016/07/05 面试题
会议开场欢迎词
2014/01/15 职场文书
企业办公室岗位职责
2014/03/12 职场文书
电子商务求职信
2014/06/15 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
为Centos安装指定版本的Docker
2022/04/01 Servers