Python装饰器实现几类验证功能做法(续)
:昨天聊了一下构造。今天试了一下。感觉昨天聊的还是不够细化。今天结合代码实现,加以一点补充。
首先观察下面这个例子
from functools import wraps def decorator(f):
@wraps(f)
def decorated_function(object_id,*args, **kwargs):
print(object_id)
return f(object_id,*args, **kwargs)
return decorated_function @decorator
def test(sys_id,object_id):
print("sys id is ",sys_id)
print("obj id is ", object_id) test('bbbb','aaa')

这个例子的目的是为了处理test的形参。假如已经知道test具有一个object_id属性。希望在装饰器中进行验证。那么按照上述写法
得到的结果和预期结果不符。因为实际上这个地方形参没有按照名称进行参数传递。而是只是按照顺序取了第一个输入的参数'bbbb'作为输出
那么接下来,根据python的尿性,我感觉只要在输入的时候指定一下输入参数对应的形参类型,这个问题就能解决了。于是:
from functools import wraps def decorator(f):
@wraps(f)
def decorated_function(object_id,sys_id,*args, **kwargs):
print(object_id)
return f(object_id,sys_id,*args, **kwargs)
return decorated_function @decorator
def test(sys_id,object_id):
print("sys id is ",sys_id)
print("obj id is ", object_id) test(sys_id='aaa',object_id='bbbb')

显然这样调整以后,达到了我们需要的效果。此外,测试了一下改动(装饰器以及目标函数)形式参数的顺序,结果不会发生变化
(但是注意:return f(object_id,sys_id,*args, **kwargs)的内容,这里没有将形参和实参绑定,因此可见装饰器实际上修改了传递参数的顺序。所以要注意代码规范,善用变化)
这个地方成功将参数和传递进入的形参进行了绑定。这样的话,我们就可以成功在以下这种动态路由写法的时候验证传递给目标函数的地址,
当前用户是否具有访问权限了

但这样还不够,当URL中带有get请求的参数的时候,就不能用传递的形参来进行处理了。因为get请求不会把参数放在函数的形参里面。而是作为get方法的返回值
那么接下来测试一下:
装饰器代码如下:
def test(f):
@wraps(f)
def decorated_function(*args, **kwargs):
sys_id = request.args.get('sys_id')
print("sys_id is ",sys_id)
object_id = request.args.get('object_id')
print("object_id is ",object_id)
return f(*args, **kwargs)
return decorated_function
绑定该装饰器的函数如下:

输出结果:

那么,通过尝试得到了这样一些信息:装饰器参数规则保持和目标函数一致时,可以完全继承该路由的规则,只要在设置验证类函数的时候,已知验证项的名称,就能直接使用
这个名称进行验证。如果这个名称是动态生成的,那么使用globals()进行动态构建,应该也能满足这个要求。
不过这样的编程方式,我感觉还是不太理想。后面找时间再优化看看。
Python装饰器实现几类验证功能做法(续)的更多相关文章
- Python装饰器实现几类验证功能做法
最近新需求来了,要给系统增加几个资源权限.尽量减少代码的改动和程序的复杂程度.所以还是使用装饰器比较科学 之前用了一些登录验证的现成装饰器模块.然后仿写一些用户管理部分的权限装饰器.比如下面这种 de ...
- python装饰器2:类装饰器
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 本文是装饰器相关内容的第二篇,关于类装饰器. "类装饰器"有两种解读方式:用来装饰类的装饰器:类作为装饰器装饰其它东西.你 ...
- 装饰器实现session登陆 验证功能
装饰器 登陆验证功能 1.装饰器模板 from django.shortcuts import render, redirect, HttpResponse from django.conf impo ...
- python 装饰器,传递类以及参数
#!/usr/bin/env python # coding=utf- import time #import redis class RedisLock(object): def __init__( ...
- python 装饰器 第二步:扩展函数的功能(不修改原函数)
# 第二步:扩展函数的功能(不能修改原函数) # 用于扩展基本函数的函数 # 把一个函数(eat函数)作为一个整体传给另外一个函数(kuozhan函数) # 这个函数(kuozhan函数)用形参fun ...
- python 装饰器、递归原理、模块导入方式
1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...
- python装饰器,迭代器,生成器,协程
python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出12 ...
- Python装饰器实现类Java注解功能
最近想用Python写一个简单生成器,类似指定类型和范围,返回指定列表: 比如想要 0 ~ 3 的整数,则 我只需要指定: 最小:0, 最大:3, 步长:1 则返回一个 [0,1,2,3] 的列表 ...
- Python 装饰器装饰类中的方法
title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...
随机推荐
- 关于开发环境中的消息在download时没有下载下来时的问题
业务场景:在开发环境改了一些代码,现在需要将这些代码(包括class和数据库对象)移植到开发环境,整理出了Objectlist(就是该模块定义了哪些数据库对象),然后上传到FTP服务器上时,再执行do ...
- 02.PHP7.x编译详解
#php7编译安装安装 ``` useradd -M -s /sbin/nologin www yum -y install openssl-devel bzip2-devel curl-devel ...
- 【转】DHCP的请求过程
首先你得清楚DHCP的请求过程:1.client向server发送请求,发向广播地址2.server向client回应一个IP,发向单播地址3.client向server回应一个确认,发向广播地址,表 ...
- EasyUi基础学习(一)—基本组件(上)
一.概述 jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.开发者不需要编写复 ...
- mysql5.7.1.3 安装说明 和出现的问题
1.可以去官网下载 http://dev.mysql.com/downloads/mysql/ 链接: http://pan.baidu.com/s/1hsO5OX2 密码: jmc6 2.解压到文件 ...
- 腾讯云上PhantomJS用法示例
崔庆才 前言 大家有没有发现之前我们写的爬虫都有一个共性,就是只能爬取单纯的html代码,如果页面是JS渲染的该怎么办呢?如果我们单纯去分析一个个后台的请求,手动去摸索JS渲染的到的一些结果,那简直没 ...
- kafka分布式消息队列介绍以及集群安装
简介 首先简单说下对kafka的理解: 1.kafka是一个分布式的消息缓存系统: 2.kafka集群中的服务器节点都被称作broker 3.kafka的客户端分为:一是producer(消息生产者) ...
- Ranking Relevance小结
Ranking Relevance是搜索排序算法的各个影响因子中相当重要的一个部分.对于Ranking Relevance的计算,过去的技术往往分为两个大的方向:Click Behavior和Text ...
- Spring Boot 中如何使用 Dubbo Activate 扩展点
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 公司的核心竞争力在于创新 – <启示录> 』 继续上一篇:< Spri ...
- 浅谈聚类算法(K-means)
聚类算法(K-means)目的是将n个对象根据它们各自属性分成k个不同的簇,使得簇内各个对象的相似度尽可能高,而各簇之间的相似度尽量小. 而如何评测相似度呢,采用的准则函数是误差平方和(因此也叫K-均 ...