首页 > 解决方案 > DRF 覆盖基于函数的视图的类函数

问题描述

我有一个基于函数的视图(带有api_view装饰器),我想更改APIView. 例如。

@api_view(['GET'])
...
def a_view(request, id):
    ...
    return Response({'data': 'testing'}, status=200)

我想initialize_request用这个覆盖 APIView 的一个函数(比如)。

class ViewOverrideMixin(object):
    def initialize_request(self, request, *args, **kwargs):
        # do_something
        super(ViewOverrideMixin, self).initialize_request(request, *args, **kwargs)

如果这是一个基于类的视图,我可以将新函数放在视图类中或继承这个 mixin,如何为基于函数的视图做到这一点?可以添加覆盖类功能的装饰器吗?


def decorator(viewfn):
    def wrapper(fn):
        # override the APIView function with custom mixin here return the class
        # what would that be?
        return fn
    return wrapper(viewfn)

标签: django-rest-frameworkdjango-viewspython-decorators

解决方案


初始化过程和其他 DRF 事情发生在@api_view装饰器内部。如果要调整功能,则必须编写自己的自定义api_view装饰器。您可以在 GitHub 中

找到相同的源代码


注意:在您的情况下,编写新的 api_view 装饰器似乎是多余的,请使用 CBV,并覆盖该方法


推荐阅读