一、装饰器是什么?
在编写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"})