这里先介绍一下啥是语法糖:语法糖指那些没有给计算机语言添加新功能,而只是对人类来说更“甜蜜”的语法。语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读。在python中 装饰器就是 一种语法糖,听着很甜蜜,用着更好使。
在介绍一下装饰器:装饰器是Python语言中的高级语法。主要的功能是对一个函数、方法、或者类进行加工,作用是为已经存在的对象添加额外的功能,提升代码的可读性。装饰器是设计模式的一种,其本质上是一个Python函数,装饰器的返回值也是一个函数对象.(ps:这里不会详细的讲解装饰器的,只说一下本人会用到基础所以提一点基础)
通俗点说就是在不改变原有函数的前提下,增加一些功能,而且装饰器还多次使用,下面举个栗子给大家简单介绍一下装饰器的使用:大致意思就是先调用 引入下面的那个函数add2为log的func,然后在内部函数fn里添加功能,在返回add2,在返回fn(建议看下计算机是怎样跑起来的,就能很容易的明白函数的运行与嵌套运行了,那本书不厚,但是很有用,这里就不细说了)
def log(f):
def fn(*a):#可变参数能够适配,方法参数列表中的个数
print type(a)#输出类型
return f(*a)
return fn
@log
def add2(n):
return reduce(lambda x,y:x+y,[x for x in range(1,n+1)])
print add2(5)
不管读者看没看懂,今天不是来将装饰器的,所以直接进入重点,
django中使用自定义的装饰器来判断用户唯一在线和回话是否到期,实现的原理很简单
第一种方法:在用户登录后,在数据库添加一个唯一的request.session["hert"]=hash(time.time())只要是能标识出唯一就行,同时放到会话中,每进行一次操作就会比对数据库的值与会话中的值是否一致,如果有的二个人登录此账号或者在别的地方登录此账号一进行操作,先登录的人一进行操作就会被挤下来,这个是发生操作的情况下,下面的装饰器直接放在每个函数上即可。
def the_one(func): '''自定义 验唯一证在线 装饰器''' def check_login_status(request): if request.session.get('qq', None): try: hert = request.session.get('hert', None) data=models.Users.objects.filter(qq=request.session.get('qq',None)).values('business_card').first() if str(hert) == str(data['business_card']): return func(request) else: return redirect('/login/') except: return redirect('/login/') else: return redirect('/login/') return check_login_status
第二种方法就是ajax的短轮询,不明白轮询也没事就是ajax加了一个定时器,很简单,下面这就是前台代码
$(function callbackFun() { $.ajax({ url: "/is_thatone/",#后台函数的url type: "GET", #请求方式随意,与后台对应即可 dataType: "json", #数据类型大多数json即可,也有例外的这里不多说 #成功时执行的回调函数 success: function (j) { if (j.code === 0) { alert("下线提示", "您的账号在其他地方登录,若非本人操作,请重新登录。"); window.location.href = '/login/'; } else { callbackFun(); setTimeout(callbackFun, 1000); //延时递归调用自己,间隔调用时间,单位毫秒这里是每过一秒向后台发送一次请求 } } }); });
后台相对来说和第一种一样,只不过返回的参数不同而已,
def is_thatone(request): if request.session.get('qq',None): try: hert = request.session.get('hert',None) data=models.Users.objects.filter(qq=request.session.get('qq',None)).values('business_card').first() if str(hert) == str(data['business_card']): return JsonResponse({'code':1}) else: return JsonResponse({'code': 0}) except Exception as e: # print e return JsonResponse({'code': 0}) else: return redirect('/login/')
本人也是新手,有交流的可以加wx:l15373097872,说明来意,特别感谢大家指出问题,共同进步,人生苦短,我选python。