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中的多线程实例教程
Aug 27 Python
centos 下面安装python2.7 +pip +mysqld
Nov 18 Python
python实现bucket排序算法实例分析
May 04 Python
python实现简单socket通信的方法
Apr 19 Python
Flask模拟实现CSRF攻击的方法
Jul 24 Python
python使用插值法画出平滑曲线
Dec 15 Python
对Python 语音识别框架详解
Dec 24 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
Django 路由层URLconf的实现
Dec 30 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
python如何快速拼接字符串
Oct 28 Python
Python学习之time模块的基本使用
Jan 17 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程序员的技术瓶颈分析
2011/07/17 PHP
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
解决laravel session失效的问题
2019/10/14 PHP
jquery实现的一个文章自定义分段显示功能
2014/05/23 Javascript
node.js中的fs.link方法使用说明
2014/12/15 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
python 19个值得学习的编程技巧
2020/08/15 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
德购商城:德国进口直邮商城
2017/06/13 全球购物
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
运动会广播稿60字
2014/01/15 职场文书
《十六年前的回忆》教学反思
2014/02/14 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
支部组织生活会方案
2014/06/10 职场文书
2014年文秘工作总结
2014/11/25 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android
Python+DeOldify实现老照片上色功能
2022/06/21 Python