【问题标题】:Creat REST Api Using Django Rest Framework使用 Django Rest 框架创建 REST Api
【发布时间】:2020-05-15 08:10:01
【问题描述】:

我正在尝试为以下方法创建一个 Restful Api 来运行 jenkins 作业以在 saucelabs 上运行。我想使用 restful API 对作业进行排队。我正在使用 Django Restful 框架。

  1. 创建方法: 接受两个文件:ProjectName 和 URL 并返回一个 Token ID。
  2. 验证状态: 接受 Token ID 并返回三个字段。 TokenID,运行:True/False 和 no_of_jobs:整数值(如果未指定,则为 0)

  3. 释放方法: 接受释放令牌调用,如果成功则返回 true。

我是 Restful API 的新手,我正在尝试在 sauce lab 上运行 Jenkins 作业,并使用 python Djano restframework 上的 restful api 对它们进行排队。引导我通过。

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')

模型.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

网址.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 --&gt; http://localhost:8000/registertestmethod/

{

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

返回

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

这个 tokenid 应该很长,我现在正在使用 id。

GET --&gt; 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 --&gt; http://localhost:8000/releasetoken/32 #应该在完成后删除作业。 正在删除并返回

{
    "Deleted": true
}

我希望它是动态的并将信息存储在数据库中。令牌应返回检查状态的所有内容。

【问题讨论】:

  • 您的问题是什么?究竟是什么问题?
  • 我想创建一个 API,我们可以将其用作队列处理程序,以便在酱实验室 VM 上运行 jenking 作业。我们必须在酱实验室上运行多项测试,但虚拟机有限。我们想使用一个 API 提供固定数量的 Jenkins 作业以在 Sauce 实验室上运行,我们在作业完成后提供三个 api 方法 Registertestmethod、checkstatus 和 releasetoken。

标签: python django rest django-rest-framework


【解决方案1】:

您可以为此使用 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)

序列化器.py

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

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

应用名称/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

这是一个非常基本的示例,您可以在其中创建一个名为saucelab 的模型,其中包含您需要的两个字段,即project_nameurl

我们创建了一个名为api 的应用程序,其中包含两个不是自动生成的文件,serializers.pyurls.py。我们创建最基本的模型序列化器,并要求它序列化模型Saucelab的所有字段。然后我们创建一个简单的modelviewset,它为您提供了一个开箱即用的CRUD 功能。如果您需要运行某些特定条件,则可以覆盖 create 方法,否则不要覆盖任何方法,只需使用适当的 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'

【讨论】:

  • 感谢 Sahil 的快速回复,我能够创建一个您提到的 api。我还有一个问题。我想在注册 registerMethod 时返回一个唯一的令牌。类似 Token 并在 checkstatus 方法上使用该令牌来获取其他信息(返回:令牌 id(相同的令牌 id) runningstatus:Ture 或 False 和 vmcount)
  • 要生成令牌,您可以使用 Django 的内置工具 crypto。我已经编辑了我的答案以反映相同的情况,请检查。
  • 另外,如果这回答了你原来的问题,你能接受答案吗?
  • 感谢 Sahil,我是 Stack Overflow 的新手,无法解释我添加的代码和少量描述的所有内容。请你看一下,如果我做得对,请告诉我。
  • 不用担心@david 我被否决票轰炸,并且经常被禁止提问,当我还是新手的时候。我想这是每个人都必须经历的痛苦之路,不要让它灰心,这个社区非常棒。坚持下去!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 2014-09-27
相关资源
最近更新 更多