函数闭包模拟session
根据上一个认证功能的问题 要解决的就是只需要登录一次 也就是登录一次之后的用户名跟密码可以保存下来让其他函数用-->全局变量
user_dic = {"user_name":None,"login":False} #全局变量 注意None以及False一定要大写
def auth_func(func):
def wrapped(*args,**kwargs):
if user_dic["user_name"] and user_dic["login"] : #这是跟全局变量相反的结果 如过login为Ture以及user_name不等于none
res = func(*args, **kwargs) #相反的结果说明已经登录好了 直接执行函数
return res
user_name = input("请输入用户名").strip()
passwd = input("请输入密码").strip()
if user_name == "sb" and passwd == "":
user_dic["user_name"] = user_name #这一行以及下一行就是修改全局变量
user_dic["login"] = True
res = func(*args,**kwargs)
return res
else:
print("用户名或密码错误")
return wrapped
@auth_func
def index():
print("欢迎来到京东")
@auth_func
def home(name):
print("亲爱的%s,欢迎回家" %name)
@auth_func
def shopping_car(name):
print("%s的购物车里有%s,%s" %(name,"tt","娃娃"))
index()
home("龙大哥")
shopping_car("龙大哥")
#升级版 这次是一个名单列表 用for循环依次遍历 user_list=[
{'name':'alex','passwd':''},
{'name':'linhaifeng','passwd':''},
{'name':'wupeiqi','passwd':''},
{'name':'yuanhao','passwd':''},] current_dic = {"user_name":None,"login":False} def auth_func(func):
def wrapped(*args,**kwargs):
if current_dic["user_name"] and current_dic["login"] :
res = func(*args, **kwargs)
return res
user_name = input("请输入用户名").strip()
passwd = input("请输入密码").strip()
for user_dic in user_list:
if user_name == user_dic["name"] and passwd == user_dic["passwd"]: #利用for循环遍历用户名名单看输入的是否符合
current_dic["user_name"] = user_name
current_dic["login"] = True
res = func(*args, **kwargs)
return res
else: #这里的else往前提前了一个空格 因为需要等用户输入# 几次直到for循环遍历所有用户名才报错,而不是输入一次就报错
print("用户名或密码错误")
return wrapped @auth_func
def index():
print("欢迎来到京东") @auth_func
def home(name):
print("亲爱的%s,欢迎回家" %name) @auth_func
def shopping_car(name):
print("%s的购物车里有%s,%s" %(name,"tt","娃娃")) index()
home("龙大哥")
shopping_car("龙大哥")
#带参数验证功能装饰器 这个较难 可以不深究 user_list=[
{'name':'alex','passwd':''},
{'name':'linhaifeng','passwd':''},
{'name':'wupeiqi','passwd':''},
{'name':'yuanhao','passwd':''},
]
current_dic={'username':None,'login':False} def auth(auth_type='filedb'): #这就是闭包 再创建一个函数做成闭包 确定用户认证 那么之后的函数都要回撤一个tab
def auth_func(func):
def wrapper(*args,**kwargs):
print('认证类型是',auth_type)
if auth_type == 'filedb':
if current_dic['username'] and current_dic['login']:
res = func(*args, **kwargs)
return res
username=input('用户名:').strip()
passwd=input('密码:').strip()
for user_dic in user_list:
if username == user_dic['name'] and passwd == user_dic['passwd']:
current_dic['username']=username
current_dic['login']=True
res = func(*args, **kwargs)
return res
else:
print('用户名或者密码错误')
elif auth_type == 'ldap':
print('鬼才特么会玩')
res = func(*args, **kwargs)
return res
else:
print('鬼才知道你用的什么认证方式')
res = func(*args, **kwargs)
return res return wrapper
return auth_func #这里返回的是auth_func 得到的就是func 所以下面的引用要加括号就是直接运行func() @auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type --->index=auth_func(index)
def index():
print('欢迎来到京东主页') @auth(auth_type='ldap') #因为用户认证的方式很多 如果要
def home(name):
print('欢迎回家%s' %name)
#
@auth(auth_type='sssssss')
def shopping_car(name):
print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃')) # print('before-->',current_dic)
# index()
# print('after--->',current_dic)
# home('产品经理')
shopping_car('产品经理')
函数闭包模拟session的更多相关文章
- JavaScript碎片—函数闭包(模拟面向对象)
经过这几天的博客浏览,让我见识大涨,其中有一篇让我感触犹深,JavaScript语言本身是没有面向对象的,但是那些大神们却深深的模拟出来了面向对象,让我震撼不已.本篇博客就是在此基础上加上自己的认知, ...
- JavaScript碎片———函数闭包(模拟面向对象)
经过这几天的博客浏览,让我见识大涨,其中有一篇让我感触犹深,JavaScript语言本身是没有面向对象的,但是那些大神们却深深的模拟出来了面向对象,让我震撼不已.本篇博客就是在此基础上加上自己的认知, ...
- Python day15装饰器基本理论,以及结合全局变量模拟session
装饰器(decorator):为其他函数添加附加功能 原则:1.不修改被修饰函数源代码 2.不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 import time def timmer( ...
- 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数
[源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...
- KEILC51可重入函数及模拟栈浅析
MARK:文章中的红色部分是个人的理解. KEILC51可重入函数及模拟栈浅析 关键字:keilc51,模拟堆栈,可重入函数调用,参数传递,C?XBP,C?ADDXBP 摘要:本文较详细的介绍了kei ...
- Swift语法基础入门三(函数, 闭包)
Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...
- 新版C#编译器关于函数闭包
新版C#编译器关于函数闭包的一处更改 在Visual Basic.NET中,如果你写下类似下面的代码: Public Sub Test() For i = 0 To 100 Dim func = ...
- 《JS权威指南学习总结--8.6 函数闭包》
内容要点: 和其他大多数现代编程一样,JS也采用词法作用域,也就是说,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 为了实现这种词法作用域,JS函数对象的内部状 ...
- 三个JS函数闭包(closure)例子
闭包是JS较难分辨的一个概念,我只是按自己的理解写下来,如有不对还请指出. 函数闭包是指当一个函数被定义在另一个函数内部时,这个内部函数使用到的变量会被封闭起来形成一个闭包,这些变量会保持形成闭包时设 ...
随机推荐
- 预警| Confluence 高危漏洞被大规模利用,阿里云WAF接入即可防护,支持免费应急服务
2019年4月4日,阿里云安全应急响应中心监测到Confluence 官方发布安全更新指出,Widget Connector 存在服务端模板注入漏洞,攻击者能利用此漏洞实现目录穿越遍历甚至远程命令执行 ...
- HZOJ 集合论
考场用的set,代码复杂度很低,时间复杂度$O(sum log)$,一发过了大样例,以为1e6的数据很稳了就没再管(然后就挂掉了……) 考后把set化成unordered_set就A了.其实$sum ...
- 从零学React Native之11 TextInput
TextInput 组件是用来通过键盘输入文字,可以使用View组件和Text组件样式,没有自己特定的样式. 与Text组件类似,TextInput组件内部的元素不再使用FlexBox布局,而采用文本 ...
- Plupload的上传机制
plupload支持多文件上传.经过测试发现,plupload在上传多个文件时,会把多个文件拆分成单个的一个一个上传.
- SDUT-2121_数据结构实验之链表六:有序链表的建立
数据结构实验之链表六:有序链表的建立 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入N个无序的整数,建立一个有序链 ...
- [***]HZOJ 优美序列
又是一道神仙题.考试的时候居然打了一个回滚莫队,不知道我咋想的…… 先说一个某OJT80,洛谷T5分的思路(差距有点大): 可以把位置和编号映射一下,区间内最大值和最小值对应的位置,每次更新,直到找到 ...
- 利用mock生成随机的东西
Mock.mock({ "list|100": [ { 'id|+1': 1,//id排列 'color': '@color()',//随机颜色 'date': '@datetim ...
- iphone开发中调用系统打电话功能
iphone开发中调用打电话功能,一般有2种: 1.系统的打电话代码,不返回当前程序: Java代码 [[UIApplication sharedApplication] openURL:[NSURL ...
- U盘还原系统
相信现在不少的人已经开始使用U盘作为启动盘来安装系统,说起来这可比用光盘装系统可是方便多了.毕竟U盘可以随身携带,至于光盘嘛,就不多说了. 可是还有许多人对U盘安装系统还是有些陌生的感觉. ...
- jieba gensim 相似度实现
博客引自:https://www.cnblogs.com//DragonFire/p/9220523.html 简单的问答已经实现了,那么问题也跟着出现了,我不能确定问题一定是"你叫什么名字 ...