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 相关文章推荐
Windows下安装python2.7及科学计算套装
Mar 05 Python
python列表操作之extend和append的区别实例分析
Jul 28 Python
Python基于pygame实现图片代替鼠标移动效果
Nov 11 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
Dec 16 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
python 将dicom图片转换成jpg图片的实例
Jan 13 Python
python实现高斯投影正反算方式
Jan 17 Python
关于tf.nn.dynamic_rnn返回值详解
Jan 20 Python
以SQLite和PySqlite为例来学习Python DB API
Feb 05 Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 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获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
详解PHP匿名函数与注意事项
2016/03/29 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
jQuery 解析xml文件
2009/08/09 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
详解Vue中的基本语法和常用指令
2019/07/23 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
2021/02/26 Vue.js
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
[44:01]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS paiN
2018/03/31 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
python之wxPython菜单使用详解
2014/09/28 Python
python中range()与xrange()用法分析
2016/09/21 Python
Python语言进阶知识点总结
2019/05/28 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
Python with语句用法原理详解
2020/07/03 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
美国沙龙美发产品购物网站:Hair.com by L’Oreal
2020/11/09 全球购物
自荐信要包含哪些内容
2013/11/06 职场文书
路政管理专业推荐信
2013/11/11 职场文书
春季防火方案
2014/05/10 职场文书
校本培训个人总结
2015/02/28 职场文书