当我们需要记录每个接口被调用时,总不能每次都写一遍数据库插入操作来记录该接口被调用了吧,这样会不仅显得啰嗦而且很呆。这时可以使用装饰器来进行该操作,我是使用了session来记录接口调用是否成功。
我的装饰器如下:
主要记录了调用接口请求方法、IP、API(接口函数名)、返回消息
#decorator.py文件
def logging_decorator(func):
@wraps(func)
def wrapped_function(*args, **kwargs):
request = args[0]
response = func(*args, **kwargs)
userinfo_dict = get_userInfo(request) #get_userInfo是我自己封装的一个获取登录用户信息的函数,我放在下段代码
ip = request.META["REMOTE_ADDR"]
method = request.method
# 该session存在的意义:每当接口调用失败时记录session,从而判断该次接口调用是否成功
if request.session.get("error"):
# 当存在error时记录请求接口失败,返回失败信息
return_msg = 2
# 每次使用该session之后将其删除以便后面接口调用时再次判断是否调用失败
del request.session["error"]
else:
return_msg = 1
if userinfo_dict["user"] == "user":
print(userinfo_dict["user"])
user_id = userinfo_dict["user_id"]
print("method:",method,"ip",ip,"api:",func.__name__,"return_msg",return_msg)
# log_api.objects.create(method=method,api_name=api_name,ip=ip,user=user_id,return_msg=return_msg)
elif userinfo_dict["user"] == "admin":
print("method:",method,"ip",ip,"api:",func.__name__,"return_msg",return_msg)
user_id = userinfo_dict["admin_id"]
return response
return wrapped_function
get_userInfo函数的封装
# 获取用户信息
def get_userInfo(request):
userInfo_dict = {} #定义一个字典存储数据
userInfo_dict["user"] = request.session.get("user")
userInfo_dict["is_login"] = request.session.get("is_login")
if userInfo_dict["user"] == "user":
userInfo_dict["user_id"] = request.session.get("user_id")
return userInfo_dict
if userInfo_dict["user"] == "admin":
userInfo_dict["admin_id"] = request.session.get("admin_id")
return userInfo_dict
装饰器使用方法:
比如我的视图函数如下
@logging_decorator #在此装饰
def index(request):
#假设try表示调用成功,except表示调用失败
try:
#接口使用调用成功则不设置session
return render(.....)
except:
#失败则记录session
request.session["error"] = "error" #用于判断接口是否调用成功
return render(.....)