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神器对付12306变态验证码
Jan 05 Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
python实现可逆简单的加密算法
Mar 22 Python
解决python3中的requests解析中文页面出现乱码问题
Apr 19 Python
Ubuntu18.04下python版本完美切换的解决方法
Jun 14 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
Aug 07 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
python实现二分类的卡方分箱示例
Nov 22 Python
Python tkinter布局与按钮间距设置方式
Mar 04 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
Apr 24 Python
Python通过Schema实现数据验证方式
Nov 12 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
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
javascript 播放器 控制
2007/01/22 Javascript
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
详解jQuery中的元素的属性和相关操作
2015/08/14 Javascript
js表单提交和submit提交的区别实例分析
2015/12/10 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
JS和canvas实现俄罗斯方块
2017/03/14 Javascript
JS实现新建文件夹功能
2017/06/17 Javascript
AngularJS表单验证功能
2017/10/19 Javascript
说说如何使用Vuex进行状态管理(小结)
2019/04/14 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
[05:06]2017亚洲邀请赛DAC回顾片
2017/04/19 DOTA
Python3实现从文件中读取指定行的方法
2015/05/22 Python
TensorFlow在MAC环境下的安装及环境搭建
2017/11/14 Python
Python编写Windows Service服务程序
2018/01/04 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
Python八皇后问题解答过程详解
2019/07/29 Python
如何使用Pytorch搭建模型
2020/10/26 Python
Python性能测试工具Locust安装及使用
2020/12/01 Python
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
vue+django实现下载文件的示例
2021/03/24 Vue.js
公司综合部的成员自我评价分享
2013/11/05 职场文书
音乐教学随笔感言
2014/02/19 职场文书
会计的岗位职责
2014/03/15 职场文书
小学生家长意见
2015/06/03 职场文书
军训结束新闻稿
2015/07/17 职场文书
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server