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写的英文字符大小写转换代码示例
Mar 06 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
Python 爬虫模拟登陆知乎
Sep 23 Python
Python中扩展包的安装方法详解
Jun 14 Python
实例分析python3实现并发访问水平切分表
Sep 29 Python
python实现远程控制电脑
May 23 Python
python实现通过队列完成进程间的多任务功能示例
Oct 28 Python
8段用于数据清洗Python代码(小结)
Oct 31 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
python绘图模块之利用turtle画图
Feb 12 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 Python
Python下opencv库的安装过程及问题汇总
Jun 11 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
discuz的php防止sql注入函数
2011/01/17 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
2021/02/18 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
授权委托书怎么写
2014/04/03 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
目标责任书格式范文
2015/05/11 职场文书
代理词怎么写
2015/05/25 职场文书
机关工会工作总结2015
2015/05/26 职场文书
施工现场安全管理制度
2015/08/05 职场文书
Python并发编程实例教程之线程的玩法
2021/06/20 Python
SQL中的三种去重方法小结
2021/11/01 SQL Server
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers