Pyramid1.3的新功能

本文解释了 Pyramid 1.3版与其前代版本相比, Pyramid 1.2。它还记录了两个版本之间的向后不兼容以及添加到 Pyramid 1.3,以及软件依赖性更改和显著的文档添加。

主要功能添加

Pyramid1.3中的主要功能添加如下。

python 3兼容性

_images/python-3.png

Pyramid继续在python 2上运行,但python 3现在也兼容了。要在python 3下使用python 3.3或更高版本,需要使用python 3.3或更高版本。

许多Pyramid插件已经与python 3兼容。例如, pyramid_debugtoolbarpyramid_jinja2pyramid_exclogpyramid_tmpyramid_mailerpyramid_handlers 都准备好了吗?但是其他插件只能在Python2下工作。另外,一些脚手架依赖项(尤其是zodb)还不能在python 3下工作。

请耐心等待,因为我们获得了对python 3的完整生态系统支持。您可以在https://github.com/pylons/pyramid/wiki/python-3-porting上看到有关正在进行的移植工作的更多详细信息。

python 3兼容性需要删除一些包依赖项,并支持旧的python版本和平台。有关详细信息,请参阅下面的“向后不兼容”部分。

这个 paster 命令已被替换

我们已经替换了 paster 与Pyramid类似的命令。为什么?支持的库 paster 命令命名 PastePasteScript 不要在python 3下运行,我们不愿意自己移植和维护它们。结果,我们不得不做出一些改变。

以前(在Pyramid1.0、1.1和1.2中),您使用 paster create ,像这样::

$ $VENV/bin/paster create -t pyramid_starter foo

在1.3中,您现在需要使用 pcreate 像这样::

$ $VENV/bin/pcreate -s starter foo

pcreate 需要用于内部Pyramid脚手架;外部分布的脚手架可以同时考虑 pcreate 和/或 paster create .

在以前的Pyramid版本中,您运行了类似这样的Pyramid应用程序:

$ $VENV/bin/paster serve development.ini

相反,您现在必须使用 pserve 1.3中的命令:

$ $VENV/bin/pserve development.ini

这个 ini Pyramid支持的配置文件格式未更改。因此,只有python 2用户才能手动安装pastescript并使用 paster serve 如果他们愿意的话。然而,使用 pserve 将在python 2和python 3下工作。

类似物 paster pshellpaster pviewspaster requestpaster ptweens 也存在于各自的控制台脚本名称下 pshellpviewsprequestptweens .

paste.httpserver 替换为 waitress 脚手架

因为 paste.httpserver 我们以前在脚手架中使用的服务器与python 3不兼容,我们已经将Pyramid脚手架使用的默认wsgi服务器 waitress 服务器。服务生服务器与python 2和python 3都兼容。

从脚手架创建项目后, development.iniproduction.ini 将有以下行:

use = egg:waitress#main

而不是这个(在旧版本中是默认的)::

use = egg:Paste#http

备注

paste.httpserver 通过将unicode的头值转换为字符串来“帮助”,这是一个颠覆了 WSGI 规范。这个 waitress 另一方面,服务器更全面地实现了wsgi规范。如果您正在修改响应的头,这可能会特别影响您。以下错误可能是此问题的指示器: 断言错误:头值必须是字符串,请检查要返回的头的类型。 常见的情况是返回unicode头而不是字符串头。

兼容性帮助程序库

一个新的 pyramid.compat 添加了模块,它为Pyramid加载项和开发环境提供了python 2/3跨接支持。

反省

添加了配置自检系统;请参见 金字塔形自省添加配置自省 有关将内省系统用作开发人员的详细信息。

Pyramid调试工具栏(0.9.7+)的最新版本提供了一个“自省”面板,向Pyramid应用程序开发人员公开自省信息。

添加了新的API以支持自省 pyramid.registry.Introspectablepyramid.config.Configurator.introspectorpyramid.config.Configurator.introspectablepyramid.registry.Registry.introspector .

@view_defaults 装饰者

如果使用类作为视图,则可以使用 pyramid.view.view_defaults 类上的类修饰符,以提供每个 @view_config 修饰该类的方法的修饰器。

例如,如果有一个类具有表示“rest actions”的方法,则所有这些方法都映射到同一个路由,但请求方法不同,而不是:

 1from pyramid.view import view_config
 2from pyramid.response import Response
 3
 4class RESTView(object):
 5    def __init__(self, request):
 6        self.request = request
 7
 8    @view_config(route_name='rest', request_method='GET')
 9    def get(self):
10        return Response('get')
11
12    @view_config(route_name='rest', request_method='POST')
13    def post(self):
14        return Response('post')
15
16    @view_config(route_name='rest', request_method='DELETE')
17    def delete(self):
18        return Response('delete')

您可以这样做:

 1from pyramid.view import view_defaults
 2from pyramid.view import view_config
 3from pyramid.response import Response
 4
 5@view_defaults(route_name='rest')
 6class RESTView(object):
 7    def __init__(self, request):
 8        self.request = request
 9
10    @view_config(request_method='GET')
11    def get(self):
12        return Response('get')
13
14    @view_config(request_method='POST')
15    def post(self):
16        return Response('post')
17
18    @view_config(request_method='DELETE')
19    def delete(self):
20        return Response('delete')

这也适用于涉及类的强制视图配置。

@view_defaults 班级装饰师 更多信息。

在不进行子类化的情况下扩展请求

现在可以扩展 pyramid.request.Request 具有属性描述符的对象,无需创建自定义请求工厂。新方法 pyramid.config.Configurator.set_request_property() 为加载项提供一个入口点,用于注册将添加到每个请求中的属性。新属性可以被重新定义,有效地缓存实例生命周期的返回值。这种方法的常见用例是获取请求的数据库连接或标识当前用户。新方法 pyramid.request.Request.set_property() 也添加了,但是配置器方法应该是首选的,因为它在属性的生命周期中提供冲突检测和一致性。

未找到和禁止查看帮助程序

找不到帮助者:

禁止的助手:

次要功能添加

  • 新API: pyramid.path.AssetResolverpyramid.path.DottedNameResolver . 前者可用于解决 asset specification 对于可用于读取资产数据的API,后者可用于解析 dotted Python name 模块或包。

  • A mako.directories 使用mako模板不再需要设置理由:可以使用绝对资产规格指定mako模板渲染器。可以使用此类资产规格编写整个应用程序,无需排序查找路径。

  • bpython 中的解释程序兼容性 pshell . 见 替代Shell 更多信息。

  • 补充 pyramid.paster.get_appsettings() API函数。此函数返回在 [app:...] PasteDeploy中的节 ini 文件。

  • 补充 pyramid.paster.setup_logging() API函数。此函数根据PasteDeploy中的日志配置设置python日志记录。 ini 文件。

  • 配置冲突报告以更易于理解的方式报告(“文件中的第11行…”,而不是类似信息的元组的repr)。

  • 我们允许将额外的关键字参数传递给 pyramid.config.Configurator.action() 方法。

  • Pyramid的反应 pyramid.static.static_view 现在使用 wsgi.file_wrapper (请参阅https://www.python.org/dev/peps/pep-0333/可选平台特定文件处理),如果Web服务器提供了一个文件处理。

  • 这个 pyramid.config.Configurator.scan() 方法可以通过 ignore 参数,可以是字符串、可调用的或由字符串和/或可调用的列表。此功能允许扫描子模块、子包和全局对象。有关如何使用 ignore 参数 scan .

  • 添加 pyramid.config.Configurator.add_traverser() API方法。见 更改遍历器 更多信息。这不是一个新特性,它只是提供了一个API,用于添加遍历器,而不需要使用ZCA API。

  • 添加 pyramid.config.Configurator.add_resource_url_adapter() API方法。见 如何改变 pyramid.request.Request.resource_url() 生成URL 更多信息。这不是一个新特性,它只是提供了一个用于添加资源URL适配器的API,而不需要使用ZCA API。

  • 当视图可调用返回无法转换为响应的值时(例如,当视图可调用返回未定义呈现器的字典或根本不返回任何值时),会出现更好的错误消息。错误消息现在包含关于视图可调用本身以及调用结果的信息。

  • 当仅.pyc模块为 config.include -ed.由于错误报告要求,这是不允许的,并且在尝试时会显示更好的错误消息。以前它会失败,比如“attributeError:'nonetype'对象没有属性'rfind'”。

  • 系统值 req 现在作为的别名提供给渲染器 request . 这意味着您现在可以,例如,在模板中 req.route_url(...) 而不是 request.route_url(...) . 这纯粹是为了减少在模板中使用请求方法和属性所需的输入量。价值 request 仍然可用,这只是一种选择。

  • 添加了一个新接口: pyramid.interfaces.IResourceURL . 实现其接口的适配器可用于在以下情况下重写资源URL生成: pyramid.request.Request.resource_url() 被称为。此接口替换了现在已弃用的 pyramid.interfaces.IContextURL 接口。

  • 传递给资源的字典 __resource_url__ 方法(见) 覆盖资源URL生成 )现在包含一个 app_url 键,表示在 pyramid.request.Request.resource_url() . 它表示可能自定义的URL前缀,其中包含用户传递给的可能自定义方案、主机和端口信息 request.resource_url . 应该用它来代替 request.application_url 必要时。

  • 这个 pyramid.request.Request.resource_url() API现在接受这些参数: app_urlschemehostport . app_url参数可用于在生成url期间批量替换url前缀。这个 schemehostport 参数可用于替换 request.application_url 部分地。

  • 一个新的API pyramid.request.Request.resource_path() 现在存在。它工作得很像 pyramid.request.Request.resource_url() 但是会产生一个相对的URL而不是绝对的URL。

  • 这个 pyramid.request.Request.route_url() API现在接受这些参数: _app_url_scheme_host_port . 这个 _app_url 参数可用于在URL生成过程中批量替换URL前缀。这个 _scheme_host_port 参数可用于替换 request.application_url 部分地。

  • 新API: pyramid.response.FileResponsepyramid.response.FileIter ,用于必须“手动”提供文件的视图。

向后不兼容

  • Pyramid不再运行在python 2.5上。这包括Jython的最新版本和GoogleAppEngine的python 2.5版本。

    原因何在?我们不能轻易地“跨越”python 2和3版本,并且支持比python 2.6早的python 2版本。运行这个Pyramid版本需要python 2.6或更高版本。如果需要使用python 2.5,应该使用最新的1.2.x版pyramid。

  • 可用脚手架的名称已更改,所支持的标志 pcreate 与支持的不同 paster create . 例如, pyramid_alchemy 现在只是 alchemy .

  • 这个 paster 命令不再是创建项目、启动服务器或运行调试命令的文档化方式。要从脚手架创建项目, paster create 替换为 pcreate 控制台脚本。为一个项目服务, paster serve 替换为 pserve 控制台脚本。名为的新控制台脚本 pshellpviewsproutesptweens 做他们的事 paster <commandname> 过去的等价物。所有相关的叙述性文件都已更新。理由:Paste和PasteScript包不在Python3下运行。

  • 默认的wsgi服务器作为 pserve 新粉刷的脚手架现在是 waitress wsgi服务器而不是 paste.httpserver 服务器。理由:Paste和PasteScript包不在Python3下运行。

  • 这个 pshell 命令(参见“paster pshell”)不再接受 --disable-ipython 命令行参数。相反,它接受 -p--python-shell 参数,可以是任何值 pythonipythonbpython .

  • 移除 pyramid.renderers.renderer_from_name 功能。自Pyramid1.0以来,它已被弃用,并且从未是API。

  • 要将zcml与pyramid>=1.3的版本一起使用,您需要 pyramid_zcml 版本>=0.8和 zope.configuration 版本>=3.8.0。这个 pyramid_zcml 包版本0.8向后兼容到Pyramid1.0,因此,如果安装了旧版本并“就位”升级Pyramid本身,则不会警告您;它可能只是断开(特别是如果使用zcml includeOverrides 指令)。

  • 传递给的字符串值 pyramid.request.Request.route_url()pyramid.request.Request.route_path() 这意味着取代“剩余”匹配现在将被URL引用除了嵌入斜杠。例如::

    config.add_route('remain', '/foo*remainder')
    request.route_path('remain', remainder='abc / def')
    # -> '/foo/abc%20/%20def'
    

    以前作为余数替换传递的字符串值附加在未接触的字符串上,没有任何URL引用。但是,如果传递的值是unicode(原始unicode不能放在URL或路径中),并且如果该值是字符串(除非被调用方引用,否则不会被引用),则在逻辑上这并不起作用。

    有些人会依赖旧的行为来附加查询字符串元素和URL的锚定部分;对不起,您需要更改代码以使用 _query 和/或 _anchor 论据 route_pathroute_url 现在就这么做。

  • 如果将包含非ASCII字符的字节串传递给 pyramid.config.Configurator.add_route() 作为一种模式,它现在将在启动时失败。改为使用Unicode。

  • 这个 path_info 路由和视图谓词现在与匹配 request.upath_info (Unicode)而不是 request.path_info (基于python 3与python 2的不确定值)。必须这样做才能规范化python 2和python 3上的匹配。

  • 这个 match_param 视图谓词不再接受dict。这不会产生负面影响,因为基于dict的参数的实现已中断。

  • 这个 pyramid.interfaces.IContextURL 接口已弃用。已经指示人们使用它在“Hook”一章中注册一个资源URL适配器来影响 pyramid.request.Request.resource_url() 自Pyramid1.0以来通过自定义遍历器找到的资源的URL生成。

    该接口仍然存在,并且使用它注册适配器(如旧版本中所述)仍然有效,但是在几个主要的Pyramid版本发布之后,该接口将从软件中删除。你应该用等价物来代替它 pyramid.interfaces.IResourceURL 适配器,使用新的 pyramid.config.Configurator.add_resource_url_adapter() 应用程序编程接口。当 pyramid.interfaces.IContextURL 在以下情况下找到适配器 pyramid.request.Request.resource_url() 被称为。

  • 去除 pyramid.config.Configurator.with_context 类方法。它从来不是一个API,它只被 pyramid_zcml 它的功能已经转移到该包的最新版本。这意味着您需要使用0.9.2或更高版本的 pyramid_zcml 随着Pyramid的释放。

  • 旧款已弃用 set_notfound_view 配置器方法现在是新的 add_notfound_view 配置器方法。同样,旧的被否决 set_forbidden_view 现在是新的 add_forbidden_view 配置器方法。这有以下影响: context 发送到视图 (context, request) 呼叫签名通过 set_notfound_viewset_forbidden_view 现在将是异常对象,而不是找到的实际资源上下文。使用 request.context 以获取实际的资源上下文。也建议停用 set_notfound_view 赞成 add_notfound_view 和废弃 set_forbidden_view 赞成 add_forbidden_view 尽管有别名。

废弃

  • 的API文档 pyramid.view.append_slash_notfound_viewpyramid.view.AppendSlashNotFoundViewFactory 被移除。这些名称仍然存在并且仍然是可导入的,但它们不再是API。使用 pyramid.config.Configurator.add_notfound_view(append_slash=True)pyramid.view.notfound_view_config(append_slash=True) 得到同样的行为。

  • 这个 set_forbidden_viewset_notfound_view 从文档中删除了配置器的方法。自从Pyramid1.1以来,它们就被弃用了。

  • 所有引用 tmpl_context 请求变量已从文档中删除。它在Pyramid中的存在让从来就不是塔架使用者的人感到困惑。它被添加为Pyramid1.0中的塔架用户的移植便利,但它从未流行过,因为Pyramid渲染系统与塔架有很大的不同,并且存在其他方法来实现它在塔架中提供的功能。它将继续“永远”存在,但不会在文档中推荐或提及。

  • 删除引用以不执行任何操作 pyramid.debug_templates 在所有Pyramid提供的.ini文件中设置。此设置以前告诉变色龙渲染更好的异常;现在不管此设置的值如何,变色龙总是渲染好的异常。

已知问题

  • 从本文开始(Pyramid1.3b2的发行版),如果您试图安装使用 alchemy 支架通过 setup.py develop 在python 3.2上,它将在尝试安装时因安装错误而退出 Pygments . 如果发生这种情况,请重新运行 setup.py develop 再次命令,它将成功完成。这是由于python 3下的sqlAlchemy 0.7.5中的一个小错误造成的,并且在后来的sqlAlchemy版本中得到了修复。关注https://github.com/sqlacchemy/sqlacchemy/issues/2421

文档增强功能

依赖关系更改

  • Pyramid不再依赖于 zope.component 包,作为测试依赖项除外。

  • Pyramid现在依赖于以下包版本:zope.interface>=3.8.0,webob>=1.2dev,repoze.lru>=0.4,zope.deprecation>=3.5.0,translationString>=0.4,用于python 3兼容性目的。它还作为测试依赖项,出于同样的原因依赖于WebTest>=1.3.1。

  • Pyramid不再依赖于 PastePasteScript 包装。这些包与Python3不兼容。

  • 依靠 venusian >=1.0A3提供扫描 ignore 支持。

脚手架变更

  • 渲染的脚手架现在已经被更改为更可重定位(在包中的文件中很少提到包名称)。

  • 这个 routesalchemy 脚手架已重命名 alchemy ,替换旧的(基于遍历) alchemy 脚手架(已退休)。

  • 这个 alchemystarter 脚手架与python 3兼容。

  • 这个 starter 默认情况下,scaffold现在使用URL调度。