Django Rest - 将 @action 与自定义装饰器一起使用

sth*_*eli 9 django rest

我在 Django 中有一个 Rest API,并且在扩展 ModelViewSet 的类中有以下方法:

@custom_decorator
@action(methods=['get'], detail=False, url_name="byname", url_path="byname")
def get_by_name(self, request):
    # get query params from get request
    username = request.query_params["username"]
    experiment = request.query_params["experiment"]
Run Code Online (Sandbox Code Playgroud)

如果我删除第一个注释器,一切正常。但是当我尝试使用两个装饰器调用此函数时,它甚至找不到特定的 url 路径。

是否可以将多个装饰器与 @action 装饰器一起使用?

Ado*_*lfo 11

我遇到了同样的问题并通过以下方式修复它:

from functools import wraps

def custom_decorator(func):
  # ADD THIS LINE TO YOUR CUSTOM DECORATOR
  @wraps(func)
  def func_wrapper(*args, **kwargs):
    return func(*args, **kwargs)
  return func_wrapper

@action(methods=['get'], detail=False, url_name="byname", url_path="byname")
@custom_decorator
def get_by_name(self, request):
  # other code
Run Code Online (Sandbox Code Playgroud)

我认为问题在于添加后动作装饰器无法识别该函数,custom_decorator因为名称已更改,因此添加@wraps(func)函数名称保持不变。(@wraps 文档