栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

DRF自定义装饰器

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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"})
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324309.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号