0

我用 django-rest-swagger 装饰了这个基于函数的视图。但是,我在 UI 中找不到允许我发布有效负载(request.body)的位置。

我看到了一些关于使用基于类的视图的解决方案,但我想知道是否有办法使用基于函数的视图来做到这一点。

先感谢您!

@renderer_classes([JSONRender])
@api_view(['POST'])
def some_method(request):
    body = json.loads(request.body)
    return JsonResponse({'status': 'ok'})

在此处输入图像描述

4

1 回答 1

3

自从 2019 年 6月弃用django-rest-swagger以来,我将回答我的问题,我刚刚找到了 2 个可行的解决方案。

第一个将全局更改 UI 。

ping.views(或您希望的任何其他位置)添加以下课程。

from rest_framework.schema import AutoSchema

class CustomSchema(AutoSchema):
    def __init__(self):
        super(CustomSchema, self).__init__()
    def get_manual_fields(self, path, method):
        extra_fields = [
            coreapi.Field('command', required=True, location='form', schema=String(), description='', type='', example='',
            coreapi.Field('params', required=False, location='form', schema=String(), description='', type='', example='',
        ]
        manual_fields = super().get_manual_fields(path, method)
        return manual_fields + extra_fields

settings.py在Django 项目中添加以下设置。

REST_FRAMEWORK = {
    # Corresponding path to where you added the class
    'DEFAULT_SCHEMA_CLASS': 'ping.views.CustomSchema', 
}

第二种解决方案可以按视图应用。您可以在这里查看官方指南

使用 @schema fromrest_framework.decorators.schema覆盖DEFAULT_SCHEMA_CLASS

@api_view(['POST'])
@schema(CustomSchema())
def your_view(request):
    print(request.body)
    return JsonResponse({'task_status': 200'})

基本上,这个想法是覆盖DEFAULT_SCHEMA_CLASS. 这个词schema是他们用来指代rest_framework.

当你@api_view()用来装饰你的基于函数的视图时,它会为你的函数分配一个属性schema,其值APIView.schema来自rest_framework.views.APIView.

rest_framework.views.APIView将进一步调用DefaultSchema()DEFAULT_SCHEMA_CLASS从您的REST_FRAMEWORK配置中加载settings.py.

无其他说明,DEFAULT_SCHEMA_CLASSrest_framework.schemas.openapi.AutoSchema官方公告为准。您可能希望将其更改为,rest_framework.schemas.coreapi.AutoSchema因为它与django_rest_swagger.


希望本教程可以帮助那些在 Django 项目中使用基于函数的视图的django-rest-swagger (2.2.0)

如果有什么我可以在这个问题上提供帮助的,请留下评论。

于 2019-10-21T02:31:39.890 回答