swagger analog
Project description
ApyWy - аналог Swagger
Основную проблему, которую решает ApyWy - большое количество времени разработчика для написания схемы (schema) для класса View. В моей версии мы можем использовать обычные питоновские словари для обозначения ожидаемых данныx и ожидаемого ответа.
Пример не настроенной версии apywy:
Пример настроенной версии apywy:
Тут для примера настроен только GET метод.
Установка
pip install apywy
- Добавляем в settings.INSTALLED_APPS:
INSTALLED_APPS = [
...
'apywy.api',
...
]
- Добавляем в urls.py главного приложения:
path('apywy/', include(('apywy.api.urls', 'apywy.api'), namespace='apywy')),
- Готово, на главной странице ApyWy - /apywy/ есть вся возможная информация без дополнительных настроек.
Настройка
По умолчанию, все что мы можем узнать для джанго-вьюшки:
- Url-путь до http-метода.
- Док-стринг для вьюшки, а также для всех ее http-методов (get, post, ...).
Но мы можем это исправить, построив ApyWy схему для вьюшки.
Наш файл views.py:
# views.py
class HomePageView(APIView):
'''
HomePageView doc string
'''
def get(self, request, some_quary):
'HomePageView.get doc string'
if some_quary == 'some value':
return Response({'ANSWER': 'GET-INVALID-RESULT'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return Response({'ANSWER': 'GET-RESULT'}, status=status.HTTP_200_OK)
def post(self, request):
'HomePageView.post doc string'
return Response({'ANSWER': 'POST-RESULT'}, status=status.HTTP_201_CREATED)
- Создаем файл apywy_schemas.py (имя не важно)
# apywy_schemas.py
from apywy.fields import StatusField, MethodField, RequestDataField
from apywy.schema import Schema
from apywy.constants.const import Constant
class HomePageSchema(Schema):
class GET(MethodField):
HTTP_200 = StatusField(expected_response_data=Constant({'ANSWER': 'GET-RESULT'}))
HTTP_500 = StatusField(expected_response_data=Constant({'ANSWER': 'GET-INVALID-RESULT'}))
- Навешиваем эту схему на view:
# views.py
...
from apywy.decorators import set_apywy_schema
from .apywy_schemas import HomePageSchema
@set_apywy_schema(HomePageSchema)
class HomePageView(APIView):
...
Итог, для метода get мы получили расширенную информацию.
- Добавим информацию про post
# apywy_schemas.py
...
class HomePageSchema(Schema):
...
class POST(MethodField):
HTTP_201 = StatusField(expected_response_data=Constant({'ANSWER': 'POST-RESULT'}))
class META:
expected_request_data = RequestDataField(Constant({'data': 'some data here'}))
По итогу, конечный вариант нашей схемы:
# apywy_schemas.py
from apywy.fields import StatusField, MethodField, RequestDataField
from apywy.schema import Schema
from apywy.constants.const import Constant
class HomePageSchema(Schema):
class GET(MethodField):
HTTP_200 = StatusField(expected_response_data=Constant({'ANSWER': 'GET-RESULT'}))
HTTP_500 = StatusField(expected_response_data=Constant({'ANSWER': 'GET-INVALID-RESULT'}))
class POST(MethodField):
HTTP_201 = StatusField(expected_response_data=Constant({'ANSWER': 'POST-RESULT'}))
class META:
expected_request_data = RequestDataField(Constant({'data': 'some data here'}))
По умолчанию на главной странице мы видим вьюшки до всех путей, кроме тех, которые относятся к неймспейсам:
('apywy', 'admin')
Если вы хотите игнорировать дополнительные неймспейсы, то укажите это в settings.NAMESPACES_TO_IGNORE:
NAMESPACES_TO_IGNORE = () # значение по умолчанию
NAMESPACES_TO_IGNORE = ('app', ) # игнорировать namespace с именем "app"
NAMESPACES_TO_IGNORE = ('*', ) # игнорировать все неймспейсы
FAQ:
- Можно ли указать query параметр для запроса в схеме?
- Можно ли указать сразу несколько ожидаемых результатов от фронта/бекенда в схеме для одного http статуса?
(1) и (2), да можно, ниже представлены различные варианты, которые поддерживает apywy:
# apywy_schemas.py
from apywy.fields import StatusField, MethodField, RequestDataField
from apywy.schema import Schema
from apywy.constants.const import ListOfConstants, Constant
class HomePageSchema(Schema):
class GET(MethodField):
# пример, когда для метода есть единственные данные, независящие от аргумента
HTTP_200 = StatusField(expected_response_data=Constant({'ANSWER': 'GET-RESULT'}))
# пример, что и выше, но только с комментарием
HTTP_300 = StatusField(
expected_response_data=Constant({'ANSWER': 'GET-RESULT FROM 300'}, comment='some comment')
)
# пример, когда для метода есть единственные данные, но мы также хотим задокументировать query паметр
HTTP_400 = StatusField(
expected_response_data=Constant({'ANSWER': 'GET-RESULT FROM 400'}, query_arg={'some query': 1})
)
# пример, когда для одного статуса может соответствовать множество данных
HTTP_500 = StatusField(
expected_response_data=ListOfConstants(
Constant(
expected_data={'ANSWER': 'GET-RESULT FROM 500'},
comment='some another comment with list of constants'
),
Constant(
expected_data={'ANSWER': 'GET-RESULT FROM 500'},
query_arg={
'some query 1': '1',
'some another query 2': 'blabla',
},
comment='some comment here'
),
)
)
class META:
# все что относится к работе со статусами распространяется и на request данные
expected_request_data = RequestDataField(
ListOfConstants(
Constant(expected_data={'some data 1': 'data1'}),
Constant(expected_data={'some another data 2': 'data2'}, query_arg={
'title': 'some title',
'book_id': '10'
}),
)
)
TODO:
- Рефакторить index.js
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file Apywy-0.0.5.tar.gz
.
File metadata
- Download URL: Apywy-0.0.5.tar.gz
- Upload date:
- Size: 15.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f3d1acfd945eb0a2664ee95e2d2b20b43977f0fd94fa6e8c2e8cc9c631a0f02e |
|
MD5 | 7359177465ca2f20f8ac1eb6e85f352c |
|
BLAKE2b-256 | 0d7523165805ec06abd8a6297509264dc7be86edc1fd3b83b0d7548347a745ab |