DRF自定义装饰器

文章目录

  • 一、装饰器是什么?
  • 二、DRF定义装饰器
    • 1.自定义装饰器
    • 2、使用


一、装饰器是什么?

在编写drf项目使用装饰器时,发现了一些小问题,因此记录下来以供以后参考。可以点击了解:装饰器decorator实现Django的访问和权限控制

二、DRF定义装饰器

1.自定义装饰器

DRF(Django REST Framework)定义装饰器有点不同,定义的装饰器需要@wrap装饰
my_decorator.py

from functools import wraps
from django.http import HttpResponse


# 判断是否有操作权限
def match_permission(func):
    @wraps(func)
    def permission(request, *args, **kwargs):
        userGroupId = request.request.session.get('userGroupId')
        if userGroupId == 0:
            return func(request, *args, **kwargs)
        else:
            return HttpResponse("你无权访问!")
    return permission


# 判断用户是否登录
def match_user(func):
    @wraps(func)
    def user(request, *args, **kwargs):
    	# requset获取的是整个ViewSet对象,request.request才能获取单个请求对象
        userName = request.request.session.get('userName')
        if userName:
            return func(request, *args, **kwargs)
        else:
            return HttpResponse("请先登录后再操作!")
    return user

2、使用

注意顺序@action一定是第一个,否则使用router自动生成路由的话会忽略该路由。

	from DV_project.my_decorator import match_user
	"""
        这样写会无法自动生成路由
        @match_user
        @action(methods=['GET'], detail=False)
    """
	# match_user不使用@wrap装饰会报错
    @action(methods=['GET'], detail=False)
    @match_user
    def loginOut(self, request):
        # 删除数据库存储的session和浏览器cookie
        request.session.delete(request.session.session_key)

        return Response({"status": "success"})

你可能感兴趣的:(python,django学习,django,python)