Django Rest Framework Создание REST API только для выполнения - PullRequest
0 голосов
/ 27 июня 2018

Я работаю над проектом django, в котором мне нужно создать API отдыха для некоторых исполнений, у меня нет особых опасений по поводу моделей, так как мне нужно выполнять только на основе пользовательских вводов / вызовов.

Вот мой сценарий:

  1. Главное - это развертывание (приложение в моем проекте)

  2. При получении запроса пользователь получит список всех своих развертывания (объекты).

  3. Пользователь отправит запрос POST на / deployments вместе с завершенным объект как:

    {
    "deployment_name": "dep4",
    "credentials": "cre4",
    "project_name": "pro4",
    "project_id": "004",
    "cluster_name": "clus4",
    "zone_region": "zon4",
    "services": "Single",
    "configuration": "conf4",
    "routing": "route4" }
    

    тогда мне нужно использовать эти данные, проверить и выполнить некоторое выполнение на основе этих данных. Например, я буду выполнять развертывания на облачной платформе с помощью этой информации, используя сторонние API.

Меня действительно смущает документация DRF, особенно о сериализаторах.

Обновление: в настоящее время, как я пытаюсь сделать POST: От apiview.py

class DeploymentsList(APIView):
    queryset = DeploymentOnUserModel.objects.all()

    def post(self, request):
        print(request.data)
        DeploymentOnUserModel.objects.create(
            deployment_name=request.data['deployment_name'],
            credentials=request.data['credentials'],
            project_name=request.data['project_name'],
            project_id=request.data['project_id'],
            cluster_name=request.data['cluster_name'],
            zone_region=request.data['zone_region'],
            services=request.data['services'],
            configuration=request.data['configuration'],
            routing=request.data['routing'],
        )
        return Response(request.data)

Итак, как я могу проверить входящие данные / запрос?

Вот моя модель развертывания:

class DeploymentOnUserModel(models.Model):
    deployment_name = models.CharField(max_length=256, )
    credentials = models.TextField(blank=False)
    project_name = models.CharField(max_length=150, blank=False)
    project_id = models.CharField(max_length=150, blank=True)
    cluster_name = models.CharField(max_length=256, blank=False)
    zone_region = models.CharField(max_length=150, blank=False)
    services = models.CharField(max_length=150, choices=services)
    configuration = models.TextField()
    routing = models.TextField()

    def save(self, **kwargs):
        if not self.id and self.services == 'Multiple' and not self.routing and not self.configuration:
            raise ValidationError("You must have to provide routing for multiple services deployment.")
        super().save(**kwargs)

от urls.py:

app_name = 'deployments'

urlpatterns = [
    path('deployments/', apiview.DeploymentsList.as_view(), name='deployment_list'),
    path('deployments/<int:pk>', apiview.DeploymentDetail.as_view(), name='deployment_detail')

]

Какой подход и что из DRF я должен использовать для реализации моего API.

1 Ответ

0 голосов
/ 27 июня 2018

Возможно, вы захотите реализовать DRF ModelSerializer и ModelViewSet , чтобы вы могли легко использовать уже имеющуюся модель Django.

Ваш сериализатор может быть таким (например, в serializers.py):

from rest_framework import serializers

from .models import DeploymentOnUser


class DeploymentOnUserModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = DeploymentOnUser
        fields = (deployment_name, credentials, )

Вы должны добавить свою собственную проверку здесь, так же, как вы делали бы с формами Django.

Представление может быть таким (например, в views.py):

from rest_framework import viewsets
from rest_framework.response import Response

from .models import DeploymentOnUserModel
from .serializers import DeploymentOnUserModelSerializer 


class DeploymentOnUserViewSet(viewsets.ModelViewSet):
    queryset = DeploymentOnUserModel.objects.all()
    serializer_class = DeploymentOnUserModelSerializer 

    def create(self, request, *args, **kwargs):
        """overwrite this for extra actions"""
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)

В зависимости от вашей ситуации вам может даже потребоваться перезаписать create - это просто показывает, как вы можете это сделать.

ModelViewSet и ModelSerializer удаляют большую часть кода шаблона. Однако, если вы ранее не использовали DRF, вам не помешает сначала пройти учебник

Не забудьте также зарегистрировать набор в urls.py:

from django.conf.urls import url, include

from rest_framework import routers

from .views import DeploymentOnUserViewSet


router = routers.DefaultRouter()
router.register('deployments', DeploymentOnUserViewSet)

urlpatterns = [
    # other patterns also go here
    url('', include(router.urls)),
]

Затем вы можете протестировать свой API, например, выполнив POST звонок на /deployments/.

Для модульного тестирования я в основном использую этот шаблон:

from rest_framework.test import APIRequestFactory

# Create a POST request, at the root
request = APIRequestFactory().post('/')
response = DeploymentOnUserViewSet.as_view({'post': 'create'})(request)
assert response.status_code == 200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...