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
posted @ 2023-04-14 09:49  含若飞  阅读(12)  评论(0编辑  收藏  举报