Creat REST Api с использованием Django Rest Framework - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь создать Restful Api для следующих способов запуска заданий jenkins для запуска на соусах. Я хочу поставить работу в очередь, используя restful API. Я использую Django Restful Framework.

  1. CreateMethod: принимает два файла: ProjectName и URL и возвращает идентификатор токена.
  2. VerifyStatus: принимает идентификатор токена и возвращает три поля. TokenID, работает: True / False и no_of_jobs: integervalue (0, если не указано)

  3. relseaseMethod: Принимает вызов токена освобождения и возвращает true в случае успеха.

Я новичок в Restful API с, я пытаюсь запустить задание Jenkins в лаборатории соуса и поставить их в очередь с помощью API успокоительного на python Djano restframework. Проведи меня через.

Views.py

class RegisterTestMethodView(APIView):
authentication_classes = [SessionAuthentication, TokenAuthentication, BasicAuthentication]
permission_classes = [IsAuthenticated]  #No access (not even read if not authorized)

def post(self, request, format=None):
    serializer = RegisterTestMethodSerializers(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response({'tokenid':serializer.data['id']}, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class CheckStatusView(APIView):


def get_object(self, pk):
    try:
        return Jobs.objects.get(pk=pk)
    except Jobs.DoesNotExist:
        raise Http404

def get(self, request, pk, format=None):
    snippet = self.get_object(pk)
    serializer = RegisterTestMethodSerializers(snippet)
    return Response({"tokenid":serializer.data["id"], "Runtestnow" : False, "VMcount" : 0 })


class ReleaseTokenView(APIView):

def get_object(self, pk):
    try:
        return Jobs.objects.get(pk=pk)
    except Jobs.DoesNotExist:
        raise Http404

def delete(self, request, pk, format=None):
    snippet = self.get_object(pk)
    snippet.delete()
    return Response(data={'Deleted':True}, status=status.HTTP_204_NO_CONTENT)

Serailizers.py

rom rest_framework import serializers
from .models import Jobs
from random import random



RegisterTestMethodSerializers(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Jobs
        fields = ('id','name','url')

Models.py

from django.db import models

# Create your models here.
class Jobs(models.Model):
    name = models.CharField(max_length=100)
    url = models.URLField()

    def __str__(self):
        return self.name

Urls. py

from django.urls import path, include
from . import views
from .views import (RegisterTestMethodView,
                    RegisterTestMethodViewDetail,
                    CheckStatusView,
                    ReleaseTokenView
                    )
from rest_framework import routers
from rest_framework.authtoken.views import obtain_auth_token
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView



urlpatterns = [
    path('', include(router.urls)),
    path('registertestmethod/',RegisterTestMethodView.as_view()),
    path('registertestmethod/<int:pk>/', 
    RegisterTestMethodViewDetail.as_view()),
    path('checkstatus/<int:pk>', CheckStatusView.as_view()),
    path('releasetoken/<int:pk>', ReleaseTokenView.as_view()),
]

Я добавил свой код здесь. У меня есть другие классы и функции в моем проекте. Я пытался удалить все из них. Вы можете увидеть дополнительный импорт в результате этого. Мой код выполняет следующие вещи.

POST --> http://localhost:8000/registertestmethod/

{

    "name": "Name",
    "url": "https://www.google.com"
}

возвращает

{
    "tokenid": 32 #unique token ID return 
}

Этот tokenid должен быть длинным. На данный момент я использую id.

GET --> http://localhost:8000/checkstatus/32

возвращает

{
    "tokenid": 32, #unique tokenid refering to register info
    "Runtestnow": false, #if job is running
    "VMcount": 0 # number of VM used in sauce lab by the Jobs
}

DELETE --> http://localhost:8000/releasetoken/32 # должен удалить задания после завершения. удаляет и возвращает

{
    "Deleted": true
}

Я хочу, чтобы это было Dynami c и хранить информацию в базе данных. Токен должен вернуть все на checkstatus.

1 Ответ

1 голос
/ 29 января 2020

Для этого можно использовать подход ModelViewSet, здесь приведен очень простой пример для конечной точки API.

views.py

from rest_framework.viewsets import ModelViewSet
from api.serializers import SaucelabsSerializer
from rest_framework.response import Response


class SaucelabModelViewSet(ModelViewSet):
    serializer_class = SaucelabSerializer
    queryset = Sauselab.objects.all() 
    http_method_names = ['get', 'head', 'options', 'post']

    def create(self, request):
        pnam = request.data.get('project_name', None)
        url = request.data.get('url', None)
        if pnam and url:
            # do something here
            return Response({'success': 'Your success message'}, status=status.HTTP_200_OK)
        else:
            return Response({"error": "Your error message"}, status=status.HTTP_400_BAD_REQUEST)

serializers.py

from rest_framework.serializer import ModelSerializer
from appname.models import Saucelab

class SaucelabSerializer(ModelSerializer):
    class Meta:
        model = Saucelab
        fields = '__all__'

appname / models.py

from django.db import models


class Saucelab(models.Model)
    project_name = models.CharField(max_length=255)
    url = models.URLField()

urls.py

from rest_framework.routers import DefaultRouter
from api import views


router = DefaultRouter()
router.register('your-endpoint-name', views.SaucelabModelViewSet, basename='your-url-name')

urlpatterns = []

urlpatterns += router.urls

Это очень простой c пример, где вы создаете модель с именем saucelab, которая имеет два поля, которые вам нужны, ie. project_name и url.

Мы создаем приложение под названием api с двумя файлами внутри него, которые не генерируются автоматически, serializers.py и urls.py. Мы создаем сериализатор самой базовой модели c и просим его сериализовать все поля модели Saucelab. Затем мы создаем простой modelviewset, который из коробки дает вам CRUD функциональность. Вы можете переопределить метод create, если вам нужно выполнить некоторые определенные условия c, в противном случае не переопределяйте какие-либо методы и просто сделайте запрос к конечной точке с помощью соответствующих методов HTTP.

Вот несколько ссылок, которые вы можете прочитать

https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset https://www.django-rest-framework.org/api-guide/serializers/#modelserializer

Для генерации случайного токена

from django.utils.crypto import get_random_string
print(get_random_string(length=25))

выход

u'rRXVe68NO7m3mHoBS488KdHaqQPD6Ofv'
...