Пользовательский интерфейс django-rest-swagger не имеет формы для тела запроса POST (представление на основе функций) - PullRequest
0 голосов
/ 19 октября 2019

У меня есть функциональный вид с декорированным django-rest-swagger. Тем не менее, я не могу найти место в пользовательском интерфейсе, которое позволяет мне размещать полезные данные (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 голосов
/ 21 октября 2019

Я отвечу на мой вопрос, так как django-rest-swagger был устарел в июне 2019 , и я только что нашел 2 возможных решения.

Первоеизменит пользовательский интерфейс глобально .

В 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 из rest_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_CLASS означает rest_framework.schemas.openapi.AutoSchema этим официальным объявлением . Возможно, вы захотите изменить его на rest_framework.schemas.coreapi.AutoSchema, поскольку он совместим с django_rest_swagger.


Надеюсь, этот урок поможет людям, которые используют django-rest-swagger (2.2.0) с function-основанные взгляды на их проект Django.

Пожалуйста, оставляйте комментарии, если есть что-то, что я могу помочь в этом вопросе.

...