python - 使用 Django Rest 框架创建 REST Api
问题描述
我正在尝试为以下方法创建一个 Restful Api 来运行 jenkins 作业以在 saucelabs 上运行。我想使用 restful API 对作业进行排队。我正在使用 Django Restful 框架。
- CreateMethod :接受两个文件:ProjectName 和 URL 并返回一个 Token ID。
VerifyStatus:接受 Token ID 并返回三个字段。TokenID, running:True/False and no_of_jobs: integervalue (0 if Not specified)
relseaseMethod:接受释放令牌调用,如果成功则返回true。
我是 Restful API 的新手,我正在尝试在酱实验室上运行 Jenkins 作业,并使用 python Djano restframework 上的 restful api 对它们进行排队。引导我通过。
视图.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 --> 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
}
我希望它是动态的并将信息存储在数据库中。令牌应返回检查状态的所有内容。
解决方案
您可以为此使用 ModelViewSet 方法,这是一个非常简单的 API 端点示例。
视图.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()
网址.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_name
和url
。
我们创建了一个名为的应用程序api
,其中包含两个不是自动生成的文件,serializers.py
以及urls.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'
推荐阅读
- progressive-web-apps - ASP .net 应用程序的工作箱
- python - SQLAlchemy 嵌套 CTE 查询
- sql - SELECT ...WHERE IN (expressionList) 语句的 expressionList 可以是变量吗?
- sql - 具有 CASE WHEN EXISTS 语句的 SQL 查询
- javascript - HTML Canvas 枪功能
- ios - 如何让 Swift Codable 类型更加通用
- git - IntelliJ VCS 正在合并 GitHub 上的项目
- c++ - getNodeInfo() 和 removeEmployee() 不起作用
- excel - Excel VBA:查找日期范围表中的日期行
- maven - 如何在 Maven 构建命令(Jenkins)中设置多个类路径?