Pyramid1.3的新功能¶
本文解释了 Pyramid 1.3版与其前代版本相比, Pyramid 1.2。它还记录了两个版本之间的向后不兼容以及添加到 Pyramid 1.3,以及软件依赖性更改和显著的文档添加。
主要功能添加¶
Pyramid1.3中的主要功能添加如下。
python 3兼容性¶
Pyramid继续在python 2上运行,但python 3现在也兼容了。要在python 3下使用python 3.3或更高版本,需要使用python 3.3或更高版本。
许多Pyramid插件已经与python 3兼容。例如, pyramid_debugtoolbar
, pyramid_jinja2
, pyramid_exclog
, pyramid_tm
, pyramid_mailer
和 pyramid_handlers
都准备好了吗?但是其他插件只能在Python2下工作。另外,一些脚手架依赖项(尤其是zodb)还不能在python 3下工作。
请耐心等待,因为我们获得了对python 3的完整生态系统支持。您可以在https://github.com/pylons/pyramid/wiki/python-3-porting上看到有关正在进行的移植工作的更多详细信息。
python 3兼容性需要删除一些包依赖项,并支持旧的python版本和平台。有关详细信息,请参阅下面的“向后不兼容”部分。
这个 paster
命令已被替换¶
我们已经替换了 paster
与Pyramid类似的命令。为什么?支持的库 paster
命令命名 Paste
和 PasteScript
不要在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 pshell
, paster pviews
, paster request
和 paster ptweens
也存在于各自的控制台脚本名称下 pshell
, pviews
, prequest
和 ptweens
.
paste.httpserver
替换为 waitress
脚手架¶
因为 paste.httpserver
我们以前在脚手架中使用的服务器与python 3不兼容,我们已经将Pyramid脚手架使用的默认wsgi服务器 waitress 服务器。服务生服务器与python 2和python 3都兼容。
从脚手架创建项目后, development.ini
和 production.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.Introspectable
, pyramid.config.Configurator.introspector
, pyramid.config.Configurator.introspectable
, pyramid.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.config.Configurator.add_notfound_view()
. 这是包装pyramid.config.Configurator.add_view()
它支持“附加斜杠”功能,并在权限方面做正确的事情(未找到的视图应该始终是公共的)。最好不要打电话add_view
直接与context=HTTPNotFound
如前所述。新API:
pyramid.view.notfound_view_config
. 这是一个类似于pyramid.view.view_config
那个电话pyramid.config.Configurator.add_notfound_view()
扫描时。最好不要使用pyramid.view.view_config
具有context=HTTPNotFound
如前所述。
禁止的助手:
新API:
pyramid.config.Configurator.add_forbidden_view()
. 这是包装pyramid.config.Configurator.add_view()
这是关于权限的正确做法。最好不要打电话add_view
直接与context=HTTPForbidden
如前所述。新API:
pyramid.view.forbidden_view_config
. 这是一个类似于pyramid.view.view_config
那个电话pyramid.config.Configurator.add_forbidden_view()
扫描时。最好不要使用pyramid.view.view_config
具有context=HTTPForbidden
如前所述。
次要功能添加¶
新API:
pyramid.path.AssetResolver
和pyramid.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_url
,scheme
,host
和port
. app_url参数可用于在生成url期间批量替换url前缀。这个scheme
,host
和port
参数可用于替换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.FileResponse
和pyramid.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
控制台脚本。名为的新控制台脚本pshell
,pviews
,proutes
和ptweens
做他们的事paster <commandname>
过去的等价物。所有相关的叙述性文件都已更新。理由:Paste和PasteScript包不在Python3下运行。默认的wsgi服务器作为
pserve
新粉刷的脚手架现在是waitress
wsgi服务器而不是paste.httpserver
服务器。理由:Paste和PasteScript包不在Python3下运行。这个
pshell
命令(参见“paster pshell”)不再接受--disable-ipython
命令行参数。相反,它接受-p
或--python-shell
参数,可以是任何值python
,ipython
或bpython
.移除
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本身,则不会警告您;它可能只是断开(特别是如果使用zcmlincludeOverrides
指令)。传递给的字符串值
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_path
或route_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_view
或set_forbidden_view
现在将是异常对象,而不是找到的实际资源上下文。使用request.context
以获取实际的资源上下文。也建议停用set_notfound_view
赞成add_notfound_view
和废弃set_forbidden_view
赞成add_forbidden_view
尽管有别名。
废弃¶
的API文档
pyramid.view.append_slash_notfound_view
和pyramid.view.AppendSlashNotFoundViewFactory
被移除。这些名称仍然存在并且仍然是可导入的,但它们不再是API。使用pyramid.config.Configurator.add_notfound_view(append_slash=True)
或pyramid.view.notfound_view_config(append_slash=True)
得到同样的行为。这个
set_forbidden_view
和set_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
文档增强功能¶
这个 sqlacalchemy+url调度wiki教程 已更新。现在使用
@view_config
修饰器和显式数据库填充脚本。对 zodb+遍历wiki教程 .
叙述性文件章节 扩展金字塔配置 已添加;它描述如何添加自定义 configuration directive 以及如何使用
pyramid.config.Configurator.action()
自定义指令中的方法。它还描述了如何添加 introspectable 物体。叙述性文件章节 金字塔形自省 加入。介绍了如何查询自省系统。
为添加了API文档章节
pyramid.scaffolds
.增加了一个名为“创建Pyramid脚手架”的叙述性文档章节。
添加了对
prequest
命令行脚本位于 prequest :调用请求 .在“命令行Pyramid”章节中添加了一个名为 将脚本制作成控制台脚本 .
从主文档中删除了“在谷歌应用引擎上运行Pyramid”教程。它在Pyramid社区食谱中继续存在 Pyramid on Google's App Engine (using appengine-monkey) . 理由:它只为GAE的python 2.5版本提供正确的信息,而这个版本的python 2.5不支持。
更新了 更改禁止的视图 部分,替换使用
add_view
或view_config
随着使用add_forbidden_view
或forbidden_view_config
.更新了 更改未找到视图 部分,替换使用
add_view
或view_config
随着使用add_notfound_view
或notfound_view_config
.更新了 重定向到斜线附加路由 部分,替换使用
add_view
或view_config
随着使用add_notfound_view
或notfound_view_config
更新了所有要使用的教程
pyramid.view.forbidden_view_config
而不是pyramid.view.view_config
具有httpForbidden上下文。
依赖关系更改¶
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不再依赖于
Paste
或PasteScript
包装。这些包与Python3不兼容。依靠
venusian
>=1.0A3提供扫描ignore
支持。
脚手架变更¶
渲染的脚手架现在已经被更改为更可重定位(在包中的文件中很少提到包名称)。
这个
routesalchemy
脚手架已重命名alchemy
,替换旧的(基于遍历)alchemy
脚手架(已退休)。这个
alchemy
和starter
脚手架与python 3兼容。这个
starter
默认情况下,scaffold现在使用URL调度。