如何使用DRF创建双前缀和读取POST有效内容

时间:2015-02-16 13:45:13

标签: python django django-rest-framework

我需要使用POST方法执行SSH命令。该命令及其参数在POST请求的JSON有效负载中指定。

我不知道如何使用django REST框架中的DefaultRouter来解决这个问题

所以我的第一个问题是;如何为此网址创建路线或视图?

POST http://127.0.0.1/datacenter/<datacenter_id>/<server_id>/ssh/

而且,如何从有效负载中获取数据以便使用它?

我尝试过这样的事情;

@detail_route(methods=['POST'])
def ssh(self, request, pk=None):
    print request.data

但我得到了“从视图中返回ResponseHttpResponseHttpStreamingResponse,但收到了<type 'NoneType'>

models.py

class Datacenter(models.Model):

    # Parent data

    def __unicode__(self):
        return self.name

class Servers(models.Model):

    datacenter = models.ForeignKey(Datacenter)

    def __unicode__(self):
            return self.hostname

serializers.py

class ServerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Server

class DatacenterSerializer(serializers.ModelSerializer):
    servers = ServerSerializer(many=True)
    class Meta:
        model = Datacenter
        fields = ('id', 'servers')

views.py

class DatacenterViewSet(viewsets.ModelViewSet):

    queryset = Datacenter.objects.all()
    serializer_class = DatacenterSerializer

class ServerViewSet(viewsets.ModelViewSet):

    queryset = Server.objects.all()
    serializer_class = ServerSerializer

urls.py

router = routers.DefaultRouter()
router.register(r'Datacenter', views.DatacenterViewSet)

urlpatterns = router.urls

1 个答案:

答案 0 :(得分:1)

您当前的代码似乎已接近完成。假设您有一个执行实际执行的函数(让我们称之为“run_ssh_command”),您的视图的基本版本可能如下所示:

@detail_route(methods=['POST'])
def ssh(self, request):
    input = json.loads(request.data)  # I'd use a serializer here
    output = run_ssh_command(input['command'])  # or whatever the field name is
    return Response(json.dumps({'result': output}),
                            content_type="application/json")

一些警告:

  1. 确保使用正确的身份验证
  2. 请记住,某些SSH命令可能需要一段时间才能运行,或者它们可能只是挂起(E.G.,等待输入),
  3. 请查看http://www.django-rest-framework.org/tutorial/2-requests-and-responses/以获取有关如何使用序列化程序进行请求验证的示例。