用于覆盖 post 方法的 Django REST 框架自定义装饰器

Posted

技术标签:

【中文标题】用于覆盖 post 方法的 Django REST 框架自定义装饰器【英文标题】:Django rest framework custom decorator for overriden post method 【发布时间】:2016-04-28 21:57:14 【问题描述】:

我的大部分 ModelViewSet 都覆盖了 create 方法(创建对象时需要执行额外的操作)。

class MyModelViewSet(serializers.ModelSerializer):
    def create(self, *args, **kwargs ):
        # some code
        return Response(
            serializer.data,
            status=status.HTTP_201_CREATED,
            headers=headers
        )

我还想为那些创建方法定义一个装饰器函数,例如这样:

def post_shower(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print result
        return result
    return wrapper

基本上我需要响应状态、标头、新对象数据。当我运行这段代码时,我得到了

ContentNotRenderedError: The response content must be rendered before it can be accessed.

print result

关于如何在装饰器中获取数据有什么建议吗? 谢谢

【问题讨论】:

也许您可以提供更多关于哪个 sn-p 实际抛出错误的详细信息,第一次或第二次。在任何情况下,如果您的视图返回TemplateResponse,您应该手动调用render() 来访问它的内容,因为它不会被自动调用See Manually calling a class based generic view 【参考方案1】:

通过response.data 访问新对象数据,通过response.status_code 访问状态。通过 Response 对象的 dict-like 接口,正式地一一访问标头。或通过response._headers 一次性非正式地全部完成。

【讨论】:

以上是关于用于覆盖 post 方法的 Django REST 框架自定义装饰器的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖 RetrieveAPIView 响应 django rest 框架

Django REST框架-请求与响应

django-rest-framework - POST 请求返回“方法 \"GET\" 不允许。”

Django Rest 框架中的发布请求处理

尝试覆盖django rest框架中的update方法,以在更新后返回整个查询集

如何仅在 Django Rest Framework 中的另一个 API 方法中调用 API POST 方法