Есть ли лучший способ создать веб-службу Django REST?

Я новичок в Python Django - в дополнение к моему вопросу.

Я создаю веб-службу REST, но я совершенно недоволен своим кодом, но я не могу найти лучшего решения. Действительно ли необходимо создавать новые классы для каждой новой части URL? Если нет, то как я могу найти лучший способ решения этой проблемы?

urls.py

URL-шаблоны

 = [
    url(r'^admin/', admin.site.urls),
    url(r'^movement/$', views.MovementDirection.as_view()),
    url(r'^movement/on/$', views.On.as_view()),
    url(r'^movement/off/$', views.Off.as_view()),
    url(r'^movement/stop/$', views.Stop.as_view()),
    url(r'^movement/forward/$', views.Forward.as_view()),
    url(r'^movement/backwards/$', views.Backward.as_view()),
]

urlpatterns = format_suffix_patterns(urlpatterns)

views.py

...
#movement/forward
class Forward(APIView):
    def get(self, request):
        print("FORWARD")
        # engine control
        return Response("Forward")

#movement/backwards
class Backward(APIView):
    def get(self, request):
        print("BACKWARD")
        # engine control
        return Response("Backward")
...

person michael-mammut    schedule 24.05.2017    source источник


Ответы (1)


Нет, вам не нужно создавать новый класс для нового URL-адреса, вам нужно новое действие в вашем наборе представлений.

url(r'^movements/$', views.MovementDirection.as_view()),

просмотры.py

class MovementDirection(ModelViewSet): # please notice the class
    @list_route
    def register(self, request):
        # you can make it on a whole endpoint
        # or on a single instance by using @detail_route

Проверьте этот вопрос для получения дополнительной информации о @detail_route и @list_route

Затем вы можете вызвать его запросом к movements/register

person Taras Matsyk    schedule 24.05.2017
comment
Спасибо за ваш очень быстрый ответ. Произошла ошибка, и я обратился к следующему вопросу: я получаю сообщение об ошибке при изменении записи urls.py на `url(r'^movements/', views.MovementDirection.as_view({'get': 'on'})),` и удалить аннотацию. Ошибка аннотации: NameError: name 'list_route' is not defined. И другая ошибка заключалась в том, что аргумент TypeError: The actions должен быть предоставлен при вызове .as_view() в ViewSet. Например .as_view({'get': 'list'}) - person michael-mammut; 24.05.2017
comment
Ошибка аннотации --› проверено ;) --› импорт отсутствует - person michael-mammut; 24.05.2017
comment
Вы должны импортировать list_route из rest_framework.decorators. Я не уверен, что это работает на ViewSet, возможно, я ввел вас в заблуждение своим ответом. - person Taras Matsyk; 24.05.2017
comment
хорошо .. чтобы завершить эту проблему есть мои шаги. url(r'^movements/on/$', views.MovementDirection.as_view({'get':'on'})), url(r'^movements/off/$', views.MovementDirection.as_view({'get':'off'})), Я определяю URL для каждого subURL и добавляю метод к каждой аннотации @detail_route(methods=['get']) в файле views.py - person michael-mammut; 25.05.2017