Skip to main content

资源调度;一种使用 WSGI HTTP_METHOD 和属性访问来解析对 endopint 的请求的方法。

项目描述

© 2009-2019 Alice Bevan-McGregor 和贡献者。

https://github.com/marrow/web.dispatch.resource

最新发布的版本。 最新的 Github 标记版本。 发布构建状态。 发布测试覆盖率。 发布依赖的状态。 订阅 Github 上的项目活动。 在 Github 上为这个项目加注星标。

介绍

调度是获取某个起点和路径,然后解析路径所指的对象的过程。这个过程几乎适用于所有 Web 应用程序框架(将 URL 转换为控制器)、RPC 系统,甚至文件系统 shell。此过程的其他术语包括:“遍历”、“路由”或“查找”。

资源调度利用 HTTP 动词(作为HTTP_METHOD WSGI 环境变量提供)来确定调用哪个方法。

这个包使用标准化的调度协议 ,并不完全供大多数开发人员直接使用。相反,目标受众是可能需要这种模块化调度以供他们自己的用户使用的框架的作者。

安装

安装web.dispatch.resource很简单,只需在终端中执行以下命令:

pip install web.dispatch.resource

注意:我们强烈建议在使用 Python 开发时始终使用某种容器、虚拟化或沙盒环境;在系统范围内安装东西很糟糕(出于各种原因)十有八九。我们更喜欢轻量级的virtualenv,其他人更喜欢像Vagrant这样健壮的解决方案。

如果您在应用程序的setup.py文件中将web.dispatch.resource添加到setup()调用的install_requires参数中,则该调度程序将在您自己的应用程序或库安装时自动安装并可用。我们建议使用“小于”版本号,以确保更新时没有意外的副作用。使用web.dispatch.resource<2.1获取当前版本的所有错误修正,使用web.dispatch.resource<3.0获取错误修正和功能更新,同时确保未安装大的重大更改。

开发版

开发构建状态。 开发测试覆盖率。 自上次发布以来的更改。 Github 问题 在 Github 上 fork 这个项目。

开发在GitHub上的 web.dispatch.resource项目中进行。那里提供了问题跟踪、文档和下载。

安装当前的开发版本需要Git,一个分布式源代码管理系统。如果您有 Git,您可以运行以下命令来下载开发版本并将其链接到您的 Python 运行时:

git clone https://github.com/marrow/web.dispatch.resource.git
pip install -e web.dispatch.resource

然后,您可以随时升级到最新版本:

cd web.dispatch.resource
git pull
pip install -U -e .

如果您想进行更改并将其贡献回项目,请分叉 GitHub 项目,进行更改并提交拉取请求。此过程超出了本文档的范围;有关更多信息,请参阅 GitHub 的文档

用法

本节分为框架作者,他们需要将整个协议集成到他们的系统中,以及这种分派形式为最终用户提供的对象交互。

可调度对象

这种形式的调度依赖于一个对象,该对象的属性(以 HTTP 动词命名)是可调用的。通常,带有方法的类用于此目的。使用web.dispatch.resource:Resource帮助器类的基本示例是:

class Potato(Resource):
    def get(self):
        return "This is a marvellous potato."

这表示基于请求中的 HTTP 动词具有两个不同端点的资源(因此是名称)。到目前为止相当基本。然而,要定义资源集合,事情会变得有点复杂:

class Field(Collection):
    __resource__ = Potato

    potatoes = 10

    def get(self):
        return str(self.potatoes) + " potatoes in the field."

    def post(self):
        Field.potatoes += 1
        return "There are now " + str(Field.potatoes) + " potatoes in the field."

    def delete(self):
        Field.potatoes = 0
        return "You monster."

    def __getitem__(self, index):
        try:
            index = int(index)
        except ValueError:
            raise KeyError()

        if index <= 0 or index > self.potatoes:
            raise KeyError()

        return index

这定义了一个资源(因为集合也是资源),上面有一些标准操作,加上这个奇怪的双下划线方法。这是一个标准的 Python 功能,可让您定义可以使用映射下标(如字典)访问类的实例。这就是资源调度从集合中查找单个项目的方式。

如果在__getitem__中引发KeyError ,则假定该标识符不存在。

此查找的结果(使用被调度的下一个路径元素)按位置传递给Collection子类的__resource__属性所指向的类的构造函数,就像对生成它的集合的引用一样。

我们现在可以更新我们的初始示例资源以作为集合的一部分:

class Potato(Resource):
    def get(self):
        return "One of " + str(self._collection.potatoes) + " beautiful potatoes."

    def delete(self):
        self._collection.potatoes -= 1
        return "You monster."

对/的GET请求的文本结果将是字段中的 10 个土豆。 您可能可以推断出剩余的行为。

进一步下降

自定义动词可以定义为附加方法。任何名称不带下划线前缀的方法都被视为 HTTP 动词。最后,如果还有剩余的路径元素,并且 next 匹配值为类的属性,则该类将被实例化并作为调度的下一步生成。

框架作者

要开始在 Web 应用程序中使用资源调度来路由请求,您需要实例化调度程序:

from web.dispatch.resource import ResourceDispatch

dispatch = ResourceDispatch()  # There is currently no configuration.

一旦你有了它,你将需要一个以某种形式的属性访问对象用作上下文的 WSGI 环境。我们这里的示例将使用 WebOb 为我们提供一个模拟环境:

from webob import Request, Response
req = Request.objects.blank('/', method="delete")
context = Context(environ=req.environ, request=req, response=Response())

现在我们有一个准备好的调度程序和准备好的上下文,我们需要根据协议准备路径:

path = req.path_info.split('/')  # Initial path from the request's PATH_INFO.
path = path[1:]  # Skip singular leading slashes; see the API specification.
path = deque(path)  # Provide the path as a deque instance, allowing popleft.

上述内容不需要像那样拆分,但您会了解在调用调度程序之前需要完成的处理步骤。例如,在 Web 框架内的整个请求期间,上述情况可能只发生一次。

我们现在可以调用调度程序并迭代调度事件:

for segment, handler, endpoint, *meta in dispatch(context, some_object, path):
    print(segment, handler, endpoint)  # Do something with this information.

当提供上下文时,它作为第一个参数传递给任何实例化的类。完成迭代后,检查最终端点。如果为True,则路径已成功映射到 处理程序变量引用的对象,否则表示能够找到的最深对象。

如果您如此选择,您总是可以直接跳到答案:

segment, handler, endpoint, *meta = list(dispatch(context, some_object, path))[-1]

然而,为回调或调度通知提供一些机制通常更有用

注意:完全允许或调度程序返回None作为已处理的路径段。在大多数不涉及类属性的情况下,资源调度将使用None以这种方式。

Python 2 & 3 兼容性

调度协议旨在通过使用namedtuple子类在未来进行扩展,但这会影响使用,因为您可能已经注意到其中的*meta。Python 3 中引入的这种语法会将任何无关的元组元素收集到一个单独的列表中。如果您真的关心元数据,请不要以这种方式解包元组。反而:

for meta in dispatch(None, some_object, path):
    segment, handler, endpoint = step[:3]  # Unpack, but preserve.
    print(segment, handler, endpoint, meta)  # Do something with this information.

本文档是从现代 Python 3 的角度编写的,丢弃for 语句本身中的元数据提供了更紧凑的示例。上述解压前三个值的方法是跨版本执行此操作的真正可移植的方法。

版本历史

3.0 版

  • 更新了最低 Python 版本。Marrow 包现在需要 Python 3.6 或更高版本。

  • 删除了 Python 2 支持和特定于版本的代码。该项目已更新为现代 Python 打包标准,包括现代命名空间使用。现代命名空间与以前的命名空间机制完全不兼容;该项目不能与任何兼容 Python 2 的 Marrow 项目同时安装。

2.0 版

  • 从 WebCore 中提取资源调度机制。

  • 更新以利用标准化调度协议。

版本 1.x

  • 流程完全集成在 WebCore Web 框架中,作为“RESTful 方言”。

执照

web.dispatch.resource 已在 MIT 开源许可下发布。

麻省理工学院许可证

版权所有 © 2009-2019 Alice Bevan-McGregor 和贡献者。

特此免费授予任何人获得本软件和相关文档文件(“软件”)的副本,以不受限制地处理本软件,包括但不限于使用、复制、修改、合并的权利、发布、分发、再许可和/或出售本软件的副本,并允许向其提供本软件的人这样做,但须符合以下条件:

上述版权声明和本许可声明应包含在本软件的所有副本或大部分内容中。

本软件按“原样”提供,不提供任何形式的明示或暗示保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担任何责任,无论是在合同、侵权或其他方面,由本软件或本软件的使用或其他交易引起或与之相关。软件。

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

web.dispatch.resource-3.0.0.tar.gz (16.6 kB 查看哈希

已上传 source

内置分布

web.dispatch.resource-3.0.0-py2.py3-none-any.whl (15.7 kB 查看哈希

已上传 py2 py3