Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python对象层次结构和REST资源?_Python_Rest_Resources_Hierarchy_Composition - Fatal编程技术网

Python对象层次结构和REST资源?

Python对象层次结构和REST资源?,python,rest,resources,hierarchy,composition,Python,Rest,Resources,Hierarchy,Composition,我目前在使用RESTAPI的Python应用程序(使用Twisted)中遇到了一个“架构”问题,我正在寻找反馈 警告!前面有很长的柱子 让我们假设以下对象层次结构: class Device(object): def __init__(): self._driver=Driver() self._status=Status() self._tasks=TaskManager() def __getattr__(self, attr_name): if h

我目前在使用RESTAPI的Python应用程序(使用Twisted)中遇到了一个“架构”问题,我正在寻找反馈

警告!前面有很长的柱子

让我们假设以下对象层次结构:

class Device(object):
  def __init__():
    self._driver=Driver()
    self._status=Status()
    self._tasks=TaskManager()

  def __getattr__(self, attr_name):
    if hasattr(self._tasks, attr_name):
        return getattr(self._tasks, attr_name)
    else:
        raise AttributeError(attr_name)

 class Driver(object):
   def __init__(self):
     self._status=DriverStatus()

   def connect(self):
      """some code here""" 

   def disconnect(self):
     """some code here"""

 class DriverStatus(object):
   def __init__(self):
     self._isConnected=False
     self._isPluggedIn=False
我还有一个相当深的对象层次结构(上面的元素只是它的一个子部分),因此,现在在RESTAPI中,这为我提供了以下资源(我知道,rest不是关于url层次结构,而是关于媒体类型,但为了简单起见):

/休息/环境

/rest/environments/{id}

/rest/environments/{id}/设备/

/rest/environments/{id}/devices/{deviceId}

/rest/environments/{id}/devices/{deviceId}/driver

/rest/environments/{id}/devices/{deviceId}/driver/driverstatus

几个月前,我从一个“肮脏”的soap类型Api切换到REST,但我不确定如何处理似乎增加的复杂性:

  • REST资源/媒体类型的激增:例如,我现在拥有了所有这些资源,而不是一个设备资源:

    • 装置
    • 设备状态
    • 司机
    • 驾驶员状态
    虽然从Resfull的角度来看这些都是有意义的,但是拥有大量子资源(每个子资源映射到一个单独的python类)是否正常


  • 将方法丰富的应用程序核心映射到Rest完整api:在Rest中,资源应该是名词,而不是动词:是否有好的规则/技巧可以从一组方法智能定义一组资源?(到目前为止,我发现的最全面的例子似乎是)

  • 影响应用程序结构的Api逻辑:应用程序的Api逻辑应该至少部分指导其内部逻辑,还是应用关注点分离是一种良好的实践?也就是说,我是否应该有一个“资源”对象的中间层,这些对象负责与应用程序核心通信,但是不会将一对一映射到核心的类

  • 如何以rest完整方式正确处理以下内容:我需要能够在客户机中显示可用驱动程序类型(即类名,而不是驱动程序实例)的列表:这是否意味着要创建另一个类似“DriverTypes”的资源

  • 这些都是相当冗长的问题,所以感谢您的耐心,欢迎您提出任何建议、反馈和批评


    致S.洛特:

    • 我所说的“过于分散的资源”的意思是,许多不同的子资源基本上仍然应用于同一个服务器端实体

    • 对于“连接”:那么这将是“DriverStatus”资源的修改版本?我认为连接总是存在的,因此使用“放”,但这会是坏事吗?考虑“放”应该是幂等的?p>
    • 你说的“停止编码和重新思考”是对的,这就是为什么我问了所有这些问题,并把问题写在纸上,以获得更好的概述

      -问题是,现在基本的“真实世界对象”对我来说是有意义的rest资源/资源集合,它们通过POST、GET、UPDATE、DELETE进行了正确的操作,但我很难理解rest方法,因为我并不本能地将它们视为“资源”


    您可以使用
    站点
    对象表示路径部分
    /rest
    ,但是路径中的
    环境
    必须是
    资源
    。从这里开始,您必须在
    环境
    渲染方法中自己处理层次结构。您获得的
    请求
    对象将具有一个
    后路径
    属性,该属性为您提供路径的剩余部分(即
    /rest/environments
    之后)。您必须解析出
    id
    ,检测路径中是否给出了
    devices
    ,如果是,则将路径的其余部分(和请求)传递到设备集合。不幸的是,Twisted不会为您处理此决定。

    您可以使用
    站点
    对象表示路径部分
    /rest
    ,但路径中的
    环境
    必须是
    资源
    。从这里开始,您必须在
    环境
    渲染方法中自己处理层次结构。您获得的
    请求
    对象将具有一个
    后路径
    属性,该属性为您提供路径的剩余部分(即
    /rest/environments
    之后)。您必须解析出
    id
    ,检测路径中是否给出了
    devices
    ,如果是,则将路径的其余部分(和请求)传递到设备集合。不幸的是,Twisted不会为您处理此决定。

    规则1。其余是关于对象的。不是方法

    其余的“资源”变得过于分散

    错。总是假的。REST资源是独立的。它们不能“太”支离破碎

    我现在拥有的不是一个设备资源,而是所有这些资源:

    设备设备状态驱动程序状态

    这些都是有道理的 从[RESTful]的角度来看,拥有大量sub是正常的吗 每个映射到单独python类的资源

    事实上,它们没有意义。这就是你的问题

    设备是一种东西/rest/environments/{id}/devices/{deviceId}

    它有地位。您应该考虑将状态和设备信息一起作为描述设备的单个复合文档。

    仅仅因为关系数据库是规范化的,并不意味着RESTful对象需要像数据库一样精确地规范化。虽然它更简单(许多框架使它非常非常简单),但它可能没有意义

    考虑连接始终存在,因此