django-rest-swagger UI没有POST请求正文的表单(基于功能的视图)

时间:2019-10-19 08:42:14

标签: django django-rest-framework django-views django-rest-swagger

我有这个基于功能的视图,其中装饰了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'})

enter image description here

1 个答案:

答案 0 :(得分:0)

我要回答我的问题,因为 django-rest-swagger 在2019年6月被弃用,我才找到了两个可行的解决方案。

第一个将全局更改用户界面

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

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

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

第二种解决方案可以按按观看次数应用。您可以在此处查看official guide

使用rest_framework.decorators.schema中的@schema覆盖DEFAULT_SCHEMA_CLASS

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

基本上,该想法是覆盖DEFAULT_SCHEMA_CLASSschema一词是他们用来为rest_framework中的每个视图指代swagger UI的术语。

使用@api_view()装饰基于函数的视图时,它将为函数分配schema中值为APIView.schema的属性rest_framework.views.APIView

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

在没有其他指定的情况下,DEFAULT_SCHEMA_CLASS以此official announcementrest_framework.schemas.openapi.AutoSchema。您可能需要将其更改为rest_framework.schemas.coreapi.AutoSchema,因为它与django_rest_swagger兼容。


希望本教程可以帮助使用django-rest-swagger (2.2.0)基于功能的视图 的Django项目的人。

如果在这个问题上有什么我需要帮助的地方,请发表评论。