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处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
python中csv文件的若干读写方法小结
Jul 04 Python
Python使用pymysql从MySQL数据库中读出数据的方法
Jul 25 Python
python pygame模块编写飞机大战
Nov 20 Python
Python对象转换为json的方法步骤
Apr 25 Python
python urllib爬虫模块使用解析
Sep 05 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
安装python及pycharm的教程图解
Oct 10 Python
Python3如何在服务器打印资产信息
Aug 27 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
Nov 01 Python
PyTorch device与cuda.device用法
Apr 03 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
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
模仿OSO的论坛(三)
2006/10/09 PHP
PHP 危险函数全解析
2009/09/09 PHP
php define的第二个参数使用方法
2013/11/04 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
Javascript计算时间差的函数分享
2011/07/04 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
AngularJS入门教程之数据绑定用法示例
2016/11/01 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
vue中defineProperty和Proxy的区别详解
2020/11/30 Vue.js
Python Trie树实现字典排序
2014/03/28 Python
介绍Python的Django框架中的QuerySets
2015/04/20 Python
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
keras的三种模型实现与区别说明
2020/07/03 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
体育专业学生自我评价范文
2014/01/17 职场文书
化妆品促销方案
2014/02/24 职场文书
责任担保书范文
2014/05/21 职场文书
会计岗位说明书
2014/07/29 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
银行员工考核评语
2014/12/31 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书