跳转到主要内容

拥有超级功能的微型Web框架

项目描述

Morepath:具有超级功能的Python Web微框架

Morepath是Python Web框架。应用程序由模型组成。每种类型的模型都发布在URL 路径上。内容通过视图公开到网络上。

文档.

构建状态

https://travis-ci.org/morepath/morepath.svg?branch=master https://coveralls.io/repos/morepath/morepath/badge.svg?branch=master

CHANGES

0.19 (2020-01-30)

  • 删除:删除了对Python 2的支持。

    如果您想使用此版本,必须升级到Python 3。

  • 添加了对Python 3.8和PyPy 3.6的支持。

  • 将Python 3.7设为默认。

  • 更新了reg.arginfo的新签名,现在它返回一个FullArgSpec元组而不是ArgSpec元组。

  • 添加了与Black代码格式化器的集成。

0.18.2 (2019-01-22)

  • 修复了在morepath.autoscan期间出现的无限递归错误。

    在两个包相互依赖的环境以及通过中间件依赖morepath的环境中运行morepath.autoscan时发生的错误。

    请参阅 #536

  • 添加了对Python 3.6和3.7的支持,并删除了对Python 3.3的支持

0.18.1 (2017-06-30)

  • 当提供多个URL参数时,链接生成不稳定。对URL参数进行排序,以便链接生成稳定。这在测试中很有用。

    这可能会破坏过去不稳定的测试。通过使用字母顺序排序来修复测试应该可以解决这个问题。

  • 毒化主机头保护不再区分大小写。

  • 现在允许在主机头中使用下划线。虽然它们在域名中无效,但在主机名中有效,并且不提供攻击面。

0.18 (2017-03-17)

  • 新增:`load` API,允许您定义如何将传入的JSON(通过POST、PUT或PATH请求)转换为Python对象以及如何对其进行验证。此功能允许您插入外部序列化和验证库,例如Marshmallow、Colander、Cerberus、Jsonschema或Voluptuous。

  • 删除:`morepath.body_model_predicate` 已从Morepath API中删除,同时删除了`morepath.App.load_json`指令和`morepath.request.body_obj`属性。如果您使用了`load_json`指令,此功能已移动到单独的 more.body_model 包。请使用此包,通过从`more.body_model.BodyModelApp`派生您的App来实现。

  • 上传大文件会导致过度消耗内存,因为没有理由消耗整个主体。现在已修复。

    请参阅 #504

  • 修复了链接前缀未应用于挂载应用程序的问题。

    请参阅 #516

0.17 (2016-12-23)

  • 删除:`morepath.ViewRegistry` 类已被删除。

  • 在发布时将通用wheels上传到PyPI。

  • 重构并简化了`ConverterRegistry`的实现。

  • 错误修复:挂载应用程序中的异常视图不再被正确查找。

  • 增加了对WebOb 1.7的兼容性。

  • 删除了json中冒号后面的额外空格。例如:{“foo”: “bar”} 现在是 {“foo”:”bar”}。

  • Morepath现在跟踪用于解析路径和视图的代码。您可以使用 more.whytool 获取一个命令行工具,该工具可以提供有关请求使用的代码的洞察。

0.16.1 (2016-10-04)

  • 调整 setup.py 以要求Reg 0.10和Dectate 0.12,否则Morepath无法正常工作。

0.16 (2016-10-04)

发布亮点

  • Morepath此版本基于Reg的新、更简洁、更快的实现。它将通用函数转换为`App`类的方法,并完全删除了隐式行为。

    如果您使用了低级`function`指令或使用`predicate`和`predicate_fallback`指令定义了自己的谓词,这将产生影响,请参阅以下详细说明。

  • 基于virtualenv和pip的新构建环境。我们已经删除了基于buildout的旧构建环境。《doc/developing.rst》有更多内容。

  • 性能工作显著提高了Morepath的性能。

删除与弃用

  • 删除:`morepath.remember_identity` 已从Morepath API中删除。

    使用

    request.app.remember_identity(response, request, identity)

    而不是

    remember_identity(response, request, identity, lookup=request.lookup)
  • 删除:从Morepath API中删除了morepath.forget_identity

    使用

    request.app.forget_identity(response, request)

    而不是

    morepath.forget_identity(response, request, lookup=request.lookup)
  • 删除 morepath.settings 已从Morepath API中删除。

    请使用morepath.App.settings属性代替。您可以通过app.settings访问它。如果您有请求,也可以通过request.app.settings访问它。以下指令现在有一个额外的可选的第一个参数,称为apppermission_ruleverify_identitydump_jsonload_jsonlink_prefix以及传递给路径指令的variables函数。

  • 删除 morepath.enable_implicitmorepath.disable_implicit 都已从Morepath API中删除。

    Morepath现在使用应用类的通用方法。应用类决定使用的上下文。

  • 删除 我们之前使用buildout来安装Morepath的开发环境。我们现在使用pip。有关详细信息,请参阅doc/developing.rst,以及以下内容。

特性

  • 破坏性变更 Dectate曾经支持用于定义指令的伪指令。但如果在使用之前忘记导入定义伪指令的模块,可能会导致导入问题。在本版本中,我们使用新的dectate.directive机制直接在App类上定义指令,从而避免了这个问题。

    如果您有定义新指令的代码,您需要相应地调整您的代码;有关更多详细信息,请参阅Dectate变更日志

  • 破坏性变更 之前Morepath直接使用Reg的dispatch函数,并有一个机制通过向dispatch函数传递一个lookup参数来控制应用上下文。lookup存储在App.lookup上。测试时需要显式传递lookup。Reg还通过线程局部变量维护此lookup,并且任何没有显式传递lookup参数的dispatch调用都直接使用此隐式lookup。

    Reg经历了一次重大重构,这影响了Morepath。因此,Morepath现在更快,并且dispatch代码变得更加Pythonic。lookup的概念已消失:没有更多的lookup参数,也没有app.lookup或隐式lookup。相反,Morepath现在利用应用上的dispatch 方法。应用本身提供显式的dispatch上下文。请参阅#448了解此变更的讨论。

    大多数Morepath应用和库项目应该可以无需更改地继续运行,但如果您使用了某些高级特性,则可能需要进行一些更改。

    • 如果您的代码中直接调用了morepath.generic中的通用函数,那么它将不再工作。请改用应用实例上的等效方法。

    • 如果您显式传递了lookup参数,请将其删除。调用应用实例上的dispatch方法就足以表示上下文。

    • 如果您在代码中定义了通用函数,您应该将其移动到morepath.App子类中,并使用morepath.dispatch_method代替reg.dispatch。直接使用reg.dispatch_method是可能的,但不建议这样做:morepath.dispatch_method包含缓存行为,可以提高应用速度。例如

      class MyApp(morepath.App):
          @morepath.dispatch_method('obj')
          def my_dispatch(self, obj):
              pass
    • 函数指令已被方法指令取代,其中您在第一个参数上指示dispatch方法。例如

      @App.method(MyApp.my_dispatch, obj=Foo)
      def my_dispatch_impl(app, obj):
          return "Implementation for Foo"
    • 可以使用predicate指令为dispatch方法安装新的谓词。第一个参数应该是dispatch方法的引用,例如

      @App.predicate(App.get_view, name='model', default=None,
                     index=ClassIndex)
      def model_predicate(obj):
        return obj.__class__

      新增了一个公开方法 App.get_view,您可以在其上安装视图谓词。

    • predicate_fallback 指令也会获取该方法的引用。装饰的函数需要与调度方法具有相同的参数;之前可以是子集。例如

      @App.predicate_fallback(App.get_view, model_predicate)
      def model_not_found(self, obj, request):
          raise HTTPNotFound()

      其中 self 指的是应用程序实例。

错误修复

  • 修复了 doctests 的 code_examples 路径,用于 tox。

构建环境

  • 我们现在使用 virtualenv 和 pip 来设置开发环境,而不是 buildout。相应的开发文档也已更新。也请参阅问题 #473#484

  • 源分发清单文件应包含 VCS 下的所有文件。

  • 由于我们达到了 pytest 的 100% 代码覆盖率,coveralls 集成已被 tox 覆盖率测试中的 --fail-under=100 参数所替代。

其他

  • 针对性能,重构了 traject 路由代码。

  • 使用标准库中的抽象基类为 morepath.IdentityPolicy

  • 将文档的目录结构组织成层次结构(#468)。

  • 扩展测试套件以涵盖 morepath.Request.reset、延迟类链接的循环检测、在 identity 参数上调度 @App.verify_identity 装饰的函数(#464)。覆盖率现在为 100%。

0.15 (2016-07-18)

删除与弃用

  • 删除:从 Morepath API 中删除了 morepath.autosetupmorepath.autocommit

    使用 autoscan。也可以使用新的显式 App.commit 方法,或者依赖 Morepath 在第一个请求时自动提交。所以,而不是

    morepath.autosetup()
    morepath.run(App())

    你做

    morepath.autoscan()
    App.commit()  # optional
    morepath.run(App())
  • 删除:已从 morepath.security 模块中删除,并且不能再从中导入。将导入改为公共 API,因此从

    from morepath.security import NO_IDENTITY

    变为

    from morepath import NO_IDENTITY
  • 弃用:已弃用 morepath.remember_identitymorepath.forget_identity

    分别使用 morepath.App.remember_identitymorepath.App.forget_identity 方法。

    而不是

    remember_identity(response, request, identity, lookup=request.lookup)
    ...
    morepath.forget_identity(response, request, lookup=request.lookup)

    你做

    request.app.remember_identity(response, request, identity)
    ...
    request.app.forget_identity(response, request)
  • 弃用morepath.settings 已弃用。

    使用 morepath.App.settings 属性。

  • 弃用morepath.enable_implicitmorepath.disable_implicit 已弃用。

    您不再需要在泛型函数之间选择隐式或显式查找,因为 API 中的所有泛型函数都已弃用。

特性

  • 提取了新的类方法 App.mounted_app_classes(),用于在提交后确定已安装的应用程序类。这可以用于在已知已在前面的提交中完成时获取 dectate.query_tool 的参数。

  • 现在 morepath.run 函数可以接受命令行参数来设置主机和端口,并且整体上更加友好。

  • 添加了 App.init_settings 以预先填充设置注册表中的 Python 字典。这可以用于从配置文件中加载设置。

  • Request 类添加了一个 reset 方法,该方法将其重置为请求处理开始时的状态。这被 more.transaction 用于在重试事务时重置请求处理。

错误修复

  • 修复了路径开头出现双斜杠时未归一化的错误。

清理

  • 清理和测试 reify 功能。

  • 在叙事文档中添加了更多的 doctests。

  • 一些小的性能调整。

  • 从 core.py 中删除未使用的导入并修复 pep8 问题。

其他

  • 添加对 Python 3.5 的支持并将其设为默认 Python 环境。

0.14 (2016-04-26)

  • 新增 我们有了新的聊天频道。您可以通过点击此链接加入我们:

    https://discord.gg/0xRQrJnOPiRsEANa

    请加入我们并一起玩!我们将停止使用(空)Freenode #morepath 频道。

  • 重大变更:将基本身份验证策略移动到 more.basicauth 扩展。基本身份验证只是您可以选择的认证方式之一,而不是默认方式。要更新代码,请让您的项目依赖于 more.basicauth 并从 more.basicauth 导入 BasicAuthIdentityPolicy

  • 重大变更:删除了一些未使用的异常类:morepath.error.ViewErrormorepath.error.ResolveError。如果您尝试在代码中捕获它们,只需删除整个 except 语句,因为它们从未被引发。

  • 已弃用 直接从 morepath.security 导入。我们将一些内容从其中移到了公共 API 中:enable_implicitdisable_implicitremember_identityforget_identityIdentityIdentityPolicyNO_IDENTITY。其中一些已经记录为可以从 morepath.security 中导入。尽管从 morepath.security 导入不会导致中断,但您应该停止从其中导入,并直接从 morepath 中导入。

  • 已弃用 morepath.autosetupmorepath.autocommit 都已被弃用。

    使用 autoscan。也可以使用新的显式 App.commit 方法,或者依赖 Morepath 在第一个请求时自动提交。所以,而不是

    morepath.autosetup()
    morepath.run(App())

    你做

    morepath.autoscan()
    App.commit()  # optional
    morepath.run(App())
  • 重大变更:直接从 morepath.app 导入 RegRegistry 的扩展将会损坏。这种导入方式需要变为:

    from morepath.app import RegRegistry

    需要变为

    from morepath.directive import RegRegistry

    此变更是为了避免 Morepath 中的循环导入,并且因为 App 已经不再直接依赖于 RegRegistry

  • 重大变更:对于 path 指令的 variables 函数,必须定义一个接受第一个 obj 参数的函数。过去,可以定义一个不接受任何参数的 variables 函数。现在这是一个错误。

  • App 中引入了一个新的 commit 方法,它提交了 App 并递归提交了所有挂载的 App。这比 autocommit 更明确,比使用较低级的 dectate.commit 更简洁。

  • 如果 App 之前未提交,则在第一次请求期间自动提交 App。参见问题 #392。

  • 引入了对 morepath.securitymorepath.autosetup 的弃用警告,并记录用户如何处理此类警告。

  • 添加了对主机头验证,以防止头部中毒攻击。

    https://github.com/morepath/morepath/issues/271

    您可以在自己的 tween 工厂中使用 morepath.HOST_HEADER_PROTECTION 来包装它之前或之下。

  • 重构了发布/视图引擎的内部。为了更有效地进行视图查找,某些参数的顺序已反转,以与公共 API 保持一致。

  • 记录了 Morepath 的内部结构,请参阅实现文档。这包括所有内部 API 的文档字符串。

  • 将 framehack 模块合并到 autosetup 中。将该模块的覆盖率提高到 100%。

  • 为 Morepath 添加了新的 cookiecutter 模板,并在文档中添加了对其的引用。

    https://github.com/morepath/morepath-cookiecutter

  • 测试清理;许多测试扫描结果显示是多余的。问题 #379

  • 添加一个测试,以验证在配置完成之前能否实例化应用程序。请参阅问题 #378 了解讨论。

  • 开始测试部分文档。

  • RegRegistry.lookup 重命名为 RegRegistry.caching_lookup,因为 lookup 属性在 reg.Registry 上覆盖了查找属性。这不会引起错误,但使调试变得更困难。

  • 重构链接生成。引入一个新的 defer_class_links 指令,允许您使用 Request.class_link() 暂时生成链接,除了使用 Request.link() 之外。这是 defer_links 的替代方案,它不支持 Request.class_link

  • Morepath 现在有了扩展 API 文档,当您想创建自己的指令并基于 Morepath 的注册表或指令构建时非常有用。

  • 一个更友好的 morepath.run,它告诉您如何使用 ctrl-C 退出它。

  • 描述如何为基于 Morepath 的应用程序编写测试的新文档。

  • 文档说明如何创建一个基于 Dectate 的命令行查询工具,该工具允许您查询 Morepath 指令。

  • 使用 Dectate 中的拓扑排序实现。解决了一个问题,其中存在太多 TopologicalSortError 类。

0.13.2 (2016-04-13)

  • 撤销了在 0.13.1 中的更改,其中如果未提交,则无法实例化 App,因为遇到了假设被破坏的实际代码。

0.13.1 (2016-04-13)

  • 启用 Dectate 查询工具的查询功能。

  • 在 API 文档中记录 scan 函数。

  • 解决 Python 中一个问题,其中 ~ (波浪号) 被由 urllib.quote & urllib.encode 引用,尽管根据 RFC,它不应被引用,因为 ~ 被视为非保留字符。

    https://www.ietf.org/rfc/rfc3986.txt

  • 在新文档“指令技巧”中记录您可以使用指令执行的一些技巧。

  • 将 tween 的创建重构为在 TweenRegistry 上的函数。

  • 更新 REST 文档;它相当过时,没有提及 body_model

  • 如果未提交就实例化了 App,则错误退出。

0.13 (2016-04-06)

  • 破坏性更改。Morepath 有了基于 dectateimportscan 的新、彻底重构的配置系统。Dectate 是从 morepath.config 模块中提取并重构成的 Morepath 配置系统。它终于也文档化了!

    Dectate 和因此 Morepath 不再使用 Venusian(或 Venusifork),因此该依赖项已消失。

    使用 morepath.autosetup 的代码仍然应该工作。

    使用 morepath.setup 并手动扫描和提交的代码需要更改。将此更改

    from morepath import setup
    
    config = morepath.setup()
    config.scan(package)
    config.commit()

    为此

    import morepath
    
    morepath.scan(package)
    morepath.autocommit()

    同样,需要将不带参数的 config.scan() 重新编写为使用不带参数的 morepath.scan()

    现在直接导入的任何内容都不需要再扫描了;直接导入模块的行为会将指令注册到 Morepath 中,尽管如以前一样,它们在提交之前不会激活。但是,扫描之前导入的内容不会造成任何伤害。

    与旧 config.scan 的签名相比,morepath.scan 的签名有所不同。不再有第三个参数 recursive=Trueonerror 参数已重命名为 handle_error,并且具有不同的行为;importscan 文档描述了详细信息。

    如果您正在编写涉及Morepath的测试,旧的测试结构如下

    import morepath
    
    def test_foo():
        config = morepath.setup()
    
        class App(morepath.App):
            testing_config = config
    
        ... use directives on App ...
    
        config.commit()
    
        ... do asserts ...

    现在需要更改为

    import morepath
    
    def test_foo():
        class App(morepath.App):
            pass
    
        ... use directives on App ...
    
        morepath.commit([App])
    
        ... do asserts ...

    因此,您需要显式地使用morepath.commit()函数,并给出要提交的应用对象列表。morepath.autocommit()在测试的上下文中将不起作用。

    如果您使用的是扫描代码的测试,也需要调整,从

    import morepath
    import some_package
    
    def test_foo():
        config = morepath.setup()
    
        config.scan(some_package)
    
        config.commit()
    
        ... do asserts ...

    更改为

    import morepath
    import some_package
    
    def test_foo():
        morepath.scan(some_package)
        morepath.commit([some_package.App])
    
        ... do asserts ...

    同样,您需要显式地使用morepath.commit来提交您想要测试的这些应用。

    如果您在代码中使用了app.registry的底层引用,它将失效;注册表已被拆分,现在位于app.config下。如果您想访问lookup,可以使用app.lookup

    如果您创建了自定义指令,创建指令的方法现在作为dectate项目的一部分进行文档说明。您需要做的主要更新是

    • morepath.Directive继承,而不是从dectate.Action继承。

    • 不再需要将app作为第一个参数。

    • __init__中不再需要调用super

    • 添加一个config类变量来声明您想要影响注册表。在我们将主要注册表拆分之前,这是

      from morepath.app import Registry
      
      ...
      config = { 'registry': Registry }
    • 反转perform的参数顺序,以便要注册的对象排在前面。因此,将

      def perform(self, registry, obj):
         ...

      改为

      def perform(self, obj, registry):
         ...

      但不要使用registry,而是使用在您动作的config中设置的注册表。

    • 不再需要prepare。在perform方法中进行错误检查,并在有问题时抛出DirectiveError

      如果您从prepare创建了子动作,则改为从dectate.Composite继承,并实现一个actions方法。

    • group_key方法已更改为group_class类变量。

    如果您正在使用morepath.sphinxext通过Sphinx autodoc来记录指令,请使用dectate.sphinxext

  • 重大变更 如果您想在@staticmethod上使用Morepath指令,您需要更改这些指令的应用顺序。过去

    @App.path(model=Foo, path='bar')
    @staticmethod
    def get_foo():
        ....

    但现在您需要编写

    @staticmethod
    @App.path(model=Foo, path='bar')
    def get_foo():
        ....
  • 重大变更 您不能再直接在@classmethod上使用Morepath path指令。相反,您可以这样做

    class Foo(object):
        @classmethod
        def get_something():
            pass
    
    @App.path('/', model=Something)(Foo.get_something)
  • 重大变更。恢复使用app.settings,这是设置注册表的快捷方式。如果您使用设置,需要将所有对app.registry.settings的引用替换为app.settings

  • 添加request.class_link。这允许您使用类而不是实例进行链接,作为一种优化。在某些情况下,仅仅为了生成对象的链接而实例化对象相对昂贵。在这种情况下,您可以使用request.class_link。这允许您链接到模型类,并手动提供variables字典。

  • 重大变更。在这次Morepath版本之前,App子类有一个名为registry的类属性。这是一个庞大的混合注册表,它继承了Morepath(reg注册表、转换注册表、traject注册表等)使用的大量不同注册表。Dectate配置系统允许我们将这个注册表拆分为许多小的相互依赖的注册表,这些注册表在指令的config中进行配置。

    虽然通常情况下你不应该这样做,但如果你的代码中某些方式依赖于 App.registry,那么你现在应该将其重写为使用 App.config.reg_registryApp.config.setting_registryApp.config.path_registry 等等。

0.12 (2016-01-27)

  • 破坏性更改。现在即使响应是直接由视图创建的(而不是视图返回一个由 morepath 渲染的值),request.after 函数也会被调用。基本上,现在保证在响应的 HTTP 状态码位于 2XX-3XX 范围内时,request.after 将被调用。

    请参阅 https://github.com/morepath/morepath/issues/346

  • 修复了 defer_link 文档中的拼写错误。

  • 在所有使用非 ASCII 字符或 URL-quoted 字符的情况中,Morepath 的链接生成没有正确地引用路径和参数。请参阅问题 #337。

  • Morepath 无法正确处理路径函数中的可变参数或关键字参数。现在在配置时间早期就抛出错误。要修复现有代码,请删除所有 *args**kw

  • 如果路径指令为路径定义了路径变量但实际未在路径函数中使用,Morepath 无法正确生成链接。现在我们在配置时间会发出抱怨。要修复现有代码,请将路径中定义的所有变量(即 {id})添加到函数签名中。

  • 某些错误(ConfigError)未报告指令行号信息。现在它们会报告。

  • setting_section 被使用时,更好地报告 ConfigError

  • morepath.request 中的 link 方法中删除了未使用的 request 参数。请参阅问题 #351。

  • 需要 venusifork 2.0a3。这是一个绕过与 six 的一些不寻常兼容性问题而修改的版本。

0.11.1 (2015-06-29)

  • setuptools 有一个恶习,就是将项目名称中的下划线改为连字符。这破坏了具有下划线名称的包(如 morepath_sqlalchemy)的新 autoscan 机制。这个问题已经被修复。

0.11 (2015-06-29)

0.10 (2015-04-09)

  • 服务器端模板语言支持:现在 html 指令(以及 viewjson)有一个 template 参数。您需要使用插件将特定的模板语言添加到项目中,例如 more.chameleonmore.jinja2,但您也可以添加自己的。

    http://morepath.readthedocs.org/en/latest/templates.html

  • 在文档中添加一个名为“网络综述”的新文档,以展示 Morepath 在网络中的位置。

    http://morepath.readthedocs.org/en/latest/web.html

  • 发布者不再对 None 渲染函数做出响应。相反,现在 view 指令在未配置的情况下使用默认的 render_view,这简化了发布者保证总是存在一个 render 函数。

    修复了 https://github.com/morepath/morepath/issues/283

  • 引入了一个 request.resolve_path 方法,允许您以编程方式解析对象路径。

  • 修改 setup.py 以使用 io.open 而不是 open,以便包含 README 和 CHANGELOG,并硬编码 UTF-8,以便在所有版本的 Python 和所有默认编码上工作。

  • 各种文档修复。

0.9 (2014-11-25)

  • 破坏性更改。在 Morepath 的先前版本中,Morepath 不会将完整的主机名包含在生成的链接中(因此 /a 而不是 http://example.com/a)。默认情况下,Morepath 0.9 现在包含在生成的链接中的完整主机名。这是为了更好地支持非浏览器客户端使用情况。在之前的不使用完全限定 URL 的系统中,客户端代码需要手动添加链接的基础,才能访问它们。这使得客户端代码比应有的更复杂。为了使编写此类客户端代码尽可能简单,Morepath 现在生成完整的 URL。

    这不应该破坏任何代码,尽管它可能会破坏依赖于先前行为的测试。要修复 webtest 风格的测试,请在预期链接前缀为 http://localhost/

    如果您出于某种原因想在应用程序中恢复旧的行为,您可以使用 link_prefix 指令

    @App.link_prefix()
    def my_link_prefix(request):
        return '' # prefix nothing again
  • 指令现在记录到 morepath.directive 日志,该日志使用标准的 Python logging 基础设施。请参阅 http://morepath.readthedocs.org/en/latest/logging.html

  • http://morepath.readthedocs.org/en/latest/paths_and_linking.html 中记录 more.forwarded 代理支持

  • 记录 request.after 与直接从视图返回响应对象相结合的行为

  • body_model_predicate 公开到 Morepath 公共 API。您现在可以说您的谓词在其之后。

  • LAST_VIEW_PREDICATE暴露给Morepath API。这是由Morepath核心定义的最后一个谓词。

  • 更新谓词文档。

  • 更新了more.static文档以反映其中的更改。

  • 修复了使用with语句对视图进行分组的文档。

  • 当你的代码似乎没有被正确扫描时,建议尝试一些事情。

  • 一个没有回退的新视图谓词,如果谓词不匹配,会导致内部服务器错误。现在它默认结果为404 Not Found。要覆盖此默认值,请定义谓词回退。

0.8 (2014-11-13)

  • 破坏性变更。Reg 0.9引入了一种创建分发函数的新方法,这导致了新的、不兼容的Reg API。

    Morepath已被调整以利用新的Reg。这不会影响许多Morepath应用程序,并且它们应该能够保持不变继续使用。但是,一些Morepath扩展和高级应用程序可能会受到影响,因此你应该注意这些更改。

    • @App.function指令已经改变

      class A(object):
          pass
      
      class B(object):
          pass
      
      @reg.generic
      def dispatch_function(a, b):
          pass
      
      @App.function(dispatch_function, A, B)
      def dispatched_to(a, b):
          return 'dispatched to A and B'

      更改为

      class A(object):
          pass
      
      class B(object):
          pass
      
      @reg.dispatch('a', 'b')
      def dispatch_function(a, b):
          pass
      
      @App.function(dispatch_function, a=A, b=B)
      def dispatched_to(a, b):
          return 'dispatched to A and B'

      Reg(参见其文档)中的新系统比我们之前拥有的系统更灵活。当你使用function时,你不再需要了解谓词的顺序——这是由@reg.dispatch()的参数决定的。你现在还可以有Reg忽略的分发函数参数。

    • @App.predicate@App.predicate_fallback指令已经更改。你现在可以为带有@reg.dispatch_external_predicates()标记的任何通用函数安装自定义谓词和回退。Morepath视图代码已简化,并基于此,现在它也可以通过使用谓词样式分发的新谓词进行扩展,因此它更强大。

  • 为视图引入了body_model谓词。你可以给它你想要用此视图处理的request.body_obj的类。与load_json指令结合使用,这允许你编写只对特定类型对象的POSTing或PUTing做出响应的视图。

  • 内部重构:我们在morepath.generic中有一些可能可覆盖的分发函数,实际上在任何指令中都没有被覆盖。通过将它们的实现移动到morepath.publishmorepath.request来简化这一点。generic.linkgeneric.consumegeneric.response现在已不存在。

  • 引入了一个link_prefix指令,允许你设置请求生成的每个链接使用的URL前缀。

  • request.view()的bug修复;请求上的lookup没有正确更新。

  • request.view()的另一个bug修复;如果使用deferred_link_app应用程序,应该调整request.app以指向当前正在延迟的应用程序。

  • 澄清了request.after的行为:它不会在处理请求期间引发的任何异常上运行,而只会为“正确”的响应运行。修复了它有时会运行的一个bug。

  • 以前,如果你在一个variables函数中的路径返回None,你会得到一个包含None的路径。现在它是LinkError

  • 如果你为路径的variables返回非字典,现在你会得到一个正确的LinkError

  • Python 3 中 defer_links 相关的一个测试未能正确执行。已修复。

  • body_obj 添加了 API 文档。同时修复了 JSON 和对象文档,以使用 request.body_obj 而不是 request.obj

  • 扩展了 API 文档以涉及安全性:详细说明身份策略需要实现的 API 和修复了一些错误。

  • 修复了 API 文档中 autoconfigautosetup 的 ReST 错误。

  • 修复了应用重用文档中 API 文档的几个 ReST 链接。

0.7 (2014-11-03)

  • 破坏性变更。挂载指令的工作方式已发生更改。应用程序之间链接的方式也发生了变化。这些更改使 API 和实现更简单、更强大。

    相关更改如下:

    • 现在可以为 morepath.App 子类定义自己的自定义 __init__。在这里,您可以指定应用程序对象应使用的参数。之前的 variables 类属性现在被忽略。

      直接从 morepath.App 继承时不需要使用 super()

      因此,而不是这样

      class MyApp(morepath.App):
          variables = ['mount_id']

      您现在应该这样写

      class MyApp(morepath.App):
          def __init__(self, mount_id):
              self.mount_id = mount_id
    • 挂载指令现在应返回正在挂载的应用程序的 实例,而不是挂载参数的字典。应用程序使用指令的 app 参数指定。所以不是这样

      @RootApp.mount(app=MyApp, path='sub/{id}')
      def mount_sub(id):
          return {
             'mount_id': id
          }

      您现在应该使用这个

      @RootApp.mount(app=MyApp, path='sub/{id}')
      def mount_sub(id):
          return MyApp(mount_id=id)
    • 挂载指令现在接受一个 variables 参数。这就像 path 指令的 variables 参数一样,用于构建链接。

      它提供一个正在挂载的应用程序的实例,并应将其路径中所需的变量重建为字典。如果省略,Morepath 将尝试从应用程序实例中获取它们,就像它尝试获取任何模型实例的属性一样。

      如上所述的 MyApp 是一个很好的例子,它需要这样做:它确实存储了正确的信息,但作为 mount_id 属性,而不是 id 属性。您应该在 mount 指令中添加一个 variables 参数,以解释 Morepath 如何获取 id

      @RootApp.mount(app=MyApp, path='sub/{id}',
                     variables=lambda app: dict(id=app.mount_id))
      def mount_sub(id):
          return MyApp(mount_id=id)

      避免这样做最简单的方法是像对模型类一样命名属性,使其与路径中的变量相同。

    • 过去,您会在由 path 装饰器装饰的函数中获得额外的挂载上下文变量作为额外的变量。现在不再是这样了。相反,您可以为此函数添加一个特殊的 app 参数。这为您提供了访问当前应用程序对象的能力,您可以在那里提取其属性。

      因此,而不是这样

      @MyApp.path(path='models/{id}', model=Model)
      def get_root(mount_id, id):
          return Model(mount_id, id)

      其中 mount_id 以一种神奇的方式从 MyApp 的挂载方式检索,您现在应该这样写

      @MyApp.path(path='models/{id}', model=Model)
      def get_root(app, id):
          return Model(app.mount_id, id)
    • 曾经有一个 request.mounted 属性。这是一个特殊的特殊 Mounted 类的实例。这个 Mounted 类现在已删除——相反,挂载应用程序只是它们类的一个实例。要访问当前挂载的应用程序,请使用 request.app

    • 请求对象以前有子对象和方法、兄弟对象方法以及父对象属性,可以用来导航到不同的“链接生成器”。为了创建应用程序中对象的链接,你需要导航到该应用程序的链接生成器。现在这些功能已经消失了。取而代之的是,你可以直接从应用程序对象进行导航,而不是链接生成器,你将获得应用程序实例。你可以将应用程序实例作为特殊的 app 参数传递给 request.linkrequest.view

      因此,而不是这样

      request.child(foo).link(obj)

      你现在可以这样写

      request.link(obj, app=request.app.child(foo))

      而不是这样

      request.parent.link(obj)

      你现在可以这样写

      request.link(obj, app=request.app.parent)

      注意,新的 defer_links 指令可以用于自动处理特定模型的此行为。

    • App 上的 .child 方法可以用于 app 类以及由 mount 指令装饰的函数的参数

      app.child(MyApp, id='foo')

      这也可以通过名称完成。假设 MyApp 被挂载在 my_app

      app.child('my_app', id='foo')

      这就是 request.child 以前的工作方式。

      作为替代,你现在可以传递一个应用 实例

      app.child(MyApp(mount_id='foo'))

      与获取子对象的其它方式不同,它接受创建应用实例所需的参数,而不是接受应用挂载时的参数。

    这些变更的动机

    Morepath 以前有一个与定义的 App 类分开的 Mount 类。从 Morepath 0.4 开始,应用程序对象变成了类,因此使其实例与挂载的应用程序相同是有意义的。这种统一现在已经实现。

    然后,使用其导航方法(子对象和友对象)来导航挂载树,而不是使用我们之前较为复杂的“链接生成器”基础设施,这也变得有道理。

    这一变化在相当程度上简化了挂载的实现,而没有去除功能,实际上使涉及的 API 更加清晰。这种简化反过来又使得实现新的 defer_links 指令变得更加容易。

  • 破坏性变更render 函数的参数已更改。这是一个你可以传递给视图指令的函数。现在,render 函数接受第二个参数,即请求。你需要更新你的 render 函数以考虑这一点。这仅影响向 viewjsonhtml 指令提供显式 render 函数的代码,由于这些函数不多,预计影响将很小。

  • 破坏性变更。在特定情况下,通过应用程序实例使用 app.settings 访问设置是有用的。这不再有效;通过 app.registry.settings 访问设置。

  • dump_jsonload_json 指令。这些指令可以让你自动将即将发送到响应的对象转换为 JSON,并将从 JSON 请求体中接收的 JSON 转换为对象。有关更多信息,请参阅 http://morepath.readthedocs.org/en/latest/json.html

  • defer_links 指令。此指令可以用于声明特定的挂载应用程序负责链接到类的实例。除了推迟 request.link() 外,它还会推迟 request.view。这使得更轻松地将应用程序组合在一起。通过从它返回 None,你还可以推迟对该应用程序父应用程序的链接。

  • 方法 app.ancestors() 和属性 app.root。这些可以方便地访问已挂载应用程序的祖先应用程序。要从请求访问,请使用 request.app.rootrequest.app.ancestors()

  • 现在 App 类有一个名为 request_class 的类属性。这确定了创建的请求的类,并且可以被子类覆盖。more.static 现在正在使用这个。

  • 作为挂载简化的一部分,现在已删除了一些实际上并没有发挥作用的通用函数:不再需要 generic.contextgeneric.traject,以及 generic.link_maker

  • 将文档更改为一处地方使用大写类名来表示 App 类。这反映了 0.4 的变化,应该有助于提高清晰度。

  • 增加了关于在开发期间自动重新加载 Morepath 的文档。

  • 不再在扫描期间静默抑制 ImportError:这可能会隐藏底层代码中的真实 ImportError

    我们之前抑制了 ImportError,因为它可能由依赖于可选依赖项的包触发。

    这是一个在包的 .tests 子目录中的常见情况,可能导入测试运行器,如 pytestpytest 仅是包的测试依赖项,而不是主线依赖项,这可能会破坏扫描。为了避免这个问题,Morepath 的 autosetup 和 autoconfig 现在自动忽略 .tests.test 子包。

    增强了 autosetupautoconfig 的 API 文档,以描述可以生成合法 ImportError 异常的情况以及如何处理它们。

  • 修复了 tween 文档中的示例。

  • 对文档字符串进行了小的改进。

0.6 (2014-09-08)

  • 修复了关于 with 语句的文档;它没有正确使用本地 view 变量。

  • 将 #morepath IRC 频道添加到社区文档中。

  • 命名挂载。在构建链接到另一个地方挂载的应用程序中的对象时,您可以将挂载的名称放入其中,而不是引用应用程序类。挂载的名称可以显式地给出,但默认为挂载路径。

    当应用程序被挂载多次并需要根据其挂载位置生成不同的链接时,这很有帮助;通过按名称引用应用程序,这是松散耦合的,并且无论挂载了什么应用程序都可以正常工作。

    这也有助于链接到可能存在或不存在的应用程序;而不是在查找 ImportError 时进行导入,您可以尝试构建链接,如果应用程序不存在,您将收到一个 LinkError 异常。尽管这仍然假设您可以导入您链接到的模型类的导入。

    (见问题 #197)

  • 在请求中引入了一个 sibling 方法。这结合了 .parent.child 步骤,以方便您在需要链接到同级应用程序时使用。

0.5.1 (2014-08-28)

  • 不再使用 sphinxcontrib.youtube,而是使用原始 HTML 嵌入,因为否则在 readthedocs 上会有太多东西破裂。

0.5 (2014-08-28)

  • 添加了 more.static 关于本地组件的文档。

  • 添加了 Morepath 上的 YouTube 视频链接:PyCon DE 2013 的主题演讲以及在 EuroPython 2014 上关于 Morepath 的演讲。

  • 向 buildout 添加了大量额外的代码质量工具。

  • 即使无法建立任何身份,也会调用 verify_identity。现在,当我们已经有 NO_IDENTITY 时,跳过调用 verify_identity。参见问题 #175。

  • 修复问题 #186:安装一个可能会消耗路径的应用程序有时会生成错误的链接。感谢 Ying Zhong 提交的bug报告和测试用例。

  • 升级到 Reg(0.8)的新版本,以支持 @reg.classgeneric 以及性能改进。

  • 在文档中添加如何处理不是 Python 名称的 URL 参数的说明(例如 foo@blah[])。您可以使用 extra_parametersget_converters 的组合来处理它们。

  • 记录使用 with 语句进行指令简写的用法(见视图文档)。

  • 创建了一个邮件列表

    https://groups.google.com/forum/#!forum/morepath

    请加入我们!

    在社区页面添加一个新页面以记录此事。

0.4.1 (2014-07-08)

  • Python 3 兼容性。我在 Morepath 0.4 中引入了一个元类,Python 3 不喜欢这个。现在测试在 Python 3 中再次通过。

  • 移除 generic.lookup,从 Morepath 0.4 开始就没有使用过了。

  • 将测试覆盖率恢复到 100%。

0.4 (2014-07-07)

  • 重大更改 移动到基于类的应用程序注册。这会破坏旧代码,需要更新。更新并不困难,只需要

    • morepath.App 进行子类化,而不是实例化它来创建新应用程序。使用子类进行扩展。

    • 要获取可以插入 WSGI 服务器的 WSGI 对象,您需要首先实例化应用程序类。

    旧方法

    app = morepath.App()

    所以,您使用指令的 app 对象是一个实例。新方法

    class app(morepath.App):
        pass

    所以,现在它是一个类。指令看起来和以前一样,所以这没有改变

    @app.view(model=Foo)
    def foo_default(self, request):
       ...

    要使用另一个应用程序扩展应用程序,您以前必须传递 extends 参数。旧方法

    sub_app = morepath.App(extends=[core_app])

    现在这变成了子类化。新方法

    class sub_app(core_app):
        pass

    还有一个 variables 参数来指定可以安装的应用程序。旧方法

    app = morepath.App(variables=['foo'])

    现在这是一个类属性。新方法

    class app(morepath.App):
        variables = ['foo']

    用于调试的帮助 name 参数已消失;现在我们可以查看类名。在 Morepath 测试内部使用的 testing_config 参数也已变为类属性。

    在旧系统中,应用程序对象既是配置点又是 WSGI 对象。旧方法

    app = morepath.App()
    
    # configuration
    @app.path(...)
    ...
    
    # wsgi
    morepath.run(app)

    在 Morepath 0.4 中,这已经被分割。正如我们已经看到的,应用程序 提供。要获取 WSGI 对象,您需要首先 实例化 它。新方法

    class app(morepath.App):
      pass
    
    # configuration
    @app.path(...)
    ...
    
    # wsgi
    morepath.run(app())

    要手动使用变量安装应用程序,我们以前需要特殊的 mount() 方法。旧方法

    mounted_wiki_app = wiki_app.mount(wiki_id=3)

    在新系统中,安装是在实例化应用程序期间完成的

    mounted_wiki_app = wiki_app(wiki_id=3)

    Python 中的类名通常使用大写字母拼写。在 Morepath 文档中,应用程序对象被拼写成小写字母。我们甚至在更新文档的示例代码中也使用了小写类名,但如果您愿意,可以在自己的代码中将它们拼写成大写。

    为什么进行这个更改?这个更改有一些主要的好处

    • 扩展和安装应用程序现在都使用自然的 Python 机制:子类化和实例化。

    • 它使我们能够将创建新指令的功能公开给 API。您可以创建特定于应用程序的指令。

  • 您可以使用 directive 指令在您的应用程序上定义自己的指令

    @my_app.directive('my_directive')

    这公开了配置系统的详细信息,目前尚未记录;请研究 morepath.directive 模块源代码以获取示例。

  • 记录如何使用 more.static 将静态资源包含到您的应用程序中。

  • 在config.scan方法中添加一个recursive=False选项。这允许非递归扫描一个包。只有它的__init__.py会被扫描。

  • 为了支持非递归扫描单个模块,我们需要一个还未集成到主分支Venusian的功能,因此目前依赖于Venusifork。

  • 在发布机制中进行了小的优化。在路由期间,更新通用函数查找上下文的工作量减少。

0.3 (2014-06-23)

  • 根据问题#132,可以在路径指令中完全吸收路径。

  • 重构了配置引擎,使Venusian和即时配置更加清晰。

  • 文档中的错别字修正(Remco Wendt)。

  • 从setuptools获取文档中的版本号。

  • 修复了变更日志,以便PyPI页面能够正确生成HTML。

  • 修复了PDF生成,以便生成完整内容。

  • 可以标记一个视图为内部视图。它将对request.view()可用,但在网页上会返回404错误。这对于构建可重用的JSON视图很有用,而不希望在网页上实际显示。

  • 一个request.child(something).view(),如果这个视图调用了上下文中的request.view(),会失败——因为它无法在挂载应用的上下文中查找视图。现在这个问题已经修复了。(感谢 Ying Zhong 报告此问题)

    随着这个修复,还重构了请求对象,使其保留一个简单的mounted属性,而不是一个mounts栈;因为挂载本身已经有父级,所以不再需要栈结构。新代码更简单。

0.2 (2014-04-24)

  • Python 3支持,特别是Python 3.4(Alec Munro - fudomunro on github)。

  • 链接生成现在考虑了SCRIPT_NAME

  • Morepath 0.1有一个安全系统,但之前没有文档记录。现在它已经被记录(文档在Morepath Security),并且对其某些行为进行了轻微调整。

    • 新增加verify_identity指令。

    • permission指令重命名为permission_rule

    • 默认的未授权错误是403禁止访问,而不是401未授权。

    • morepath.remembermorepath.forbet重命名为morepath.remember_identitymorepath.forget_identity

  • 安装文档的调整。(Auke Willem Oosterhoff)

  • .gitignore的调整(Auke Willem Oosterhoff)

0.1 (2014-04-08)

  • 首次公开发布。

项目详情


下载文件

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

源分布

morepath-0.19.tar.gz (232.7 kB 查看哈希)

上传于 来源

构建版本

morepath-0.19-py2.py3-none-any.whl (130.6 kB 查看哈希值)

上传于 Python 2 Python 3

由以下提供支持