Django在类中使用装饰器
类的视图函数中使用装饰器
场景描述
前后端分离项目 后端暴露接口 前端调用
一个接口根据不同的请求方式处理不同的内容
比如我有一个/user接口:
get:返回成员信息
post:添加信息
put:修改信息
delete:删除信息
在每个请求中都需要判断凭证,也就是请求头中的某个字段,来鉴别用户身份,
如果每个请求中都写同样的逻辑,很繁琐,因此我们可以考虑使用装饰器
如果直接在类外面写个函数,再处理逻辑,好像访问不到request对象,因此我们可以使用django自带的工具库,method_decorator
代码示例
import json
from django.http import JsonResponse
from django.views import View
from django.contrib.sessions.models import Session
from .models import Admin
from datetime import datetime, timedelta
from django.utils.decorators import method_decorator
# 自定义装饰器
def check_session_id(func):
def wrapper(request, *args, **kwargs):
try:
print('进入了装饰器')
print(request.headers)
session_id = request.headers.get('Authorization',False).split(' ')[1]
except (AttributeError, IndexError):
# except (AttributeError, IndexError):
print('捕获到了异常')
return JsonResponse({'status': 'error', 'msg': '请先登录'}, status=401)
if session_id is not None:
try:
print('sessionid不为空')
session = Session.objects.get(session_key=session_id)
except Session.DoesNotExist:
session = None
# 如果通过当前sessionid可以获取到数据
if session is not None:
user_data = session.get_decoded()
# print(f'当前用户:{user_data.username},角色:{user_data.role}')
print(user_data['info'])
return func(request, *args, **kwargs)
else:
return JsonResponse({'status': 'error', 'msg': "非法访问"}, status=401)
else:
return JsonResponse({'status': 'error'}, status=401)
return wrapper
class AdminInfo(View):
# 获取当前所有员工以及admin信息
@method_decorator(check_session_id)
def get(self, request):
print('进入了get请求')
user_list = []
users = Admin.objects.all()
for user in users:
obj = {}
obj['name'] = user.name
obj['password'] = user.password
obj['role'] = user.role
user_list.append(obj)
return JsonResponse({'status': 'success', 'data': user_list}, status=200)
@check_session_id
def post(self, request):
pass
@check_session_id
def put(self, request):
pass
@check_session_id
def delete(self, request):
pass