我有这个基于功能的视图,其中装饰了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'})
答案 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_CLASS
。 schema
一词是他们用来为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 announcement为rest_framework.schemas.openapi.AutoSchema
。您可能需要将其更改为rest_framework.schemas.coreapi.AutoSchema
,因为它与django_rest_swagger
兼容。
希望本教程可以帮助使用django-rest-swagger (2.2.0)
和基于功能的视图 的Django项目的人。
如果在这个问题上有什么我需要帮助的地方,请发表评论。