拥有超级功能的微型Web框架
项目描述
Morepath:具有超级功能的Python Web微框架
Morepath是Python Web框架。应用程序由模型组成。每种类型的模型都发布在URL 路径上。内容通过视图公开到网络上。
文档.
构建状态
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访问它。以下指令现在有一个额外的可选的第一个参数,称为app:permission_rule、verify_identity、dump_json、load_json、link_prefix以及传递给路径指令的variables函数。
删除 morepath.enable_implicit 和 morepath.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。
构建环境
其他
0.15 (2016-07-18)
删除与弃用
删除:从 Morepath API 中删除了 morepath.autosetup 和 morepath.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_identity 和 morepath.forget_identity。
分别使用 morepath.App.remember_identity 和 morepath.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_implicit 和 morepath.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.ViewError、morepath.error.ResolveError。如果您尝试在代码中捕获它们,只需删除整个 except 语句,因为它们从未被引发。
已弃用 直接从 morepath.security 导入。我们将一些内容从其中移到了公共 API 中:enable_implicit、disable_implicit、remember_identity、forget_identity、Identity、IdentityPolicy、NO_IDENTITY。其中一些已经记录为可以从 morepath.security 中导入。尽管从 morepath.security 导入不会导致中断,但您应该停止从其中导入,并直接从 morepath 中导入。
已弃用 morepath.autosetup 和 morepath.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.security、morepath.autosetup 的弃用警告,并记录用户如何处理此类警告。
添加了对主机头验证,以防止头部中毒攻击。
见 https://github.com/morepath/morepath/issues/271
您可以在自己的 tween 工厂中使用 morepath.HOST_HEADER_PROTECTION 来包装它之前或之下。
重构了发布/视图引擎的内部。为了更有效地进行视图查找,某些参数的顺序已反转,以与公共 API 保持一致。
记录了 Morepath 的内部结构,请参阅实现文档。这包括所有内部 API 的文档字符串。
将 framehack 模块合并到 autosetup 中。将该模块的覆盖率提高到 100%。
为 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,它不应被引用,因为 ~ 被视为非保留字符。
在新文档“指令技巧”中记录您可以使用指令执行的一些技巧。
将 tween 的创建重构为在 TweenRegistry 上的函数。
更新 REST 文档;它相当过时,没有提及 body_model。
如果未提交就实例化了 App,则错误退出。
0.13 (2016-04-06)
破坏性更改。Morepath 有了基于 dectate 和 importscan 的新、彻底重构的配置系统。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=True。onerror 参数已重命名为 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_registry、App.config.setting_registry、App.config.path_registry 等等。
0.12 (2016-01-27)
破坏性更改。现在即使响应是直接由视图创建的(而不是视图返回一个由 morepath 渲染的值),request.after 函数也会被调用。基本上,现在保证在响应的 HTTP 状态码位于 2XX-3XX 范围内时,request.after 将被调用。
修复了 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)
破坏性更改。必须重写 morepath.autoconfig 和 morepath.autosetup 方法。在此之前,Morepath 无法自动加载使用 pip 安装的包。
因此,如果 setup.py 的名称与分发包或模块的名称不同,Morepath 将无法自动加载包。
例如:一个名为 my-app 的包,包含一个名为 myapp 的模块,将不再自动加载。
这样的包现在需要手动加载
import morepath import myapp config = morepath.setup() config.scan(myapp) config.commit()
config.scan 方法现在默认排除 'test' 和 'tests' 目录。
如果模板目录引用的是绝对路径,则 template_directory 指令将不再检查当前模块。这使得在当前模块可能不可用的情况下编写测试变得更加容易。
如果 identity_policy 定义了此类参数,则它将 settings 传递给函数。这样,可以创建考虑设置的标识策略。
现在请求路径中的点总是被规范化。在此之前,Morepath 主要是依赖客户端来做这件事,这可能会成为潜在的安全问题。
关于 Morepath 配置系统的补充文档: http://morepath.readthedocs.org/en/latest/configuration.html
如何在 https://morepath.readthedocs.org/en/latest/more.static.html 中提供静态图像的补充文档
将未记录的 pdb 从 __init__.py 中移除,因为它有时会导致问题。相反,在特殊模块 morepath.pdbsupport 中的 API 文档中记录。
0.10 (2015-04-09)
服务器端模板语言支持:现在 html 指令(以及 view 和 json)有一个 template 参数。您需要使用插件将特定的模板语言添加到项目中,例如 more.chameleon 和 more.jinja2,但您也可以添加自己的。
在文档中添加一个名为“网络综述”的新文档,以展示 Morepath 在网络中的位置。
发布者不再对 None 渲染函数做出响应。相反,现在 view 指令在未配置的情况下使用默认的 render_view,这简化了发布者保证总是存在一个 render 函数。
引入了一个 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.publish和morepath.request来简化这一点。generic.link、generic.consume和generic.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 文档中 autoconfig 和 autosetup 的 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.link 和 request.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 函数以考虑这一点。这仅影响向 view、json 和 html 指令提供显式 render 函数的代码,由于这些函数不多,预计影响将很小。
破坏性变更。在特定情况下,通过应用程序实例使用 app.settings 访问设置是有用的。这不再有效;通过 app.registry.settings 访问设置。
dump_json 和 load_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.root 和 request.app.ancestors()。
现在 App 类有一个名为 request_class 的类属性。这确定了创建的请求的类,并且可以被子类覆盖。more.static 现在正在使用这个。
作为挂载简化的一部分,现在已删除了一些实际上并没有发挥作用的通用函数:不再需要 generic.context 和 generic.traject,以及 generic.link_maker。
将文档更改为一处地方使用大写类名来表示 App 类。这反映了 0.4 的变化,应该有助于提高清晰度。
增加了关于在开发期间自动重新加载 Morepath 的文档。
不再在扫描期间静默抑制 ImportError:这可能会隐藏底层代码中的真实 ImportError。
我们之前抑制了 ImportError,因为它可能由依赖于可选依赖项的包触发。
这是一个在包的 .tests 子目录中的常见情况,可能导入测试运行器,如 pytest。 pytest 仅是包的测试依赖项,而不是主线依赖项,这可能会破坏扫描。为了避免这个问题,Morepath 的 autosetup 和 autoconfig 现在自动忽略 .tests 和 .test 子包。
增强了 autosetup 和 autoconfig 的 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_parameters 和 get_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.remember
和morepath.forbet
重命名为morepath.remember_identity
和morepath.forget_identity
。
安装文档的调整。(Auke Willem Oosterhoff)
.gitignore
的调整(Auke Willem Oosterhoff)
0.1 (2014-04-08)
首次公开发布。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。