跳转到主要内容

为Grok项目提供Paster支持。

项目描述

grokcore.startup

此包为使用pasterWSGI启动Grok项目提供元素。

设置 grokcore.startup

此包的设置没有特殊要求。

您需要做的就是,在运行时使此包可用。

使用 zc.buildout 或其他 setuptools 相关设置,可以通过简单地将包名 grokcore.startup 添加到 setup.py 中您项目的所需包中来实现。

详细说明

将 Grok 项目设置为 paster 服务 WSGI 应用程序

此包的主要目标是提供支持,使 Grok 应用程序能够作为 paster 服务 WSGI 应用程序运行。为了实现这一点,必须设置一些配置文件。

使用 grokproject 设置项目

设置 Grok 项目的最便捷方法是使用 grokproject。一旦安装,您就可以创建如下项目:

$ grokproject Sample

这将为您生成所有配置文件。

手动设置项目

在我们可以使用 grokcore.startup 之前,我们必须在项目根目录中设置几个配置文件

  • setup.py

  • buildout.cfg(可选)

  • zope.conf(通常位于 Grok 项目的 parts/etc/ 子目录中)

  • site.zcml(通常位于 Grok 项目的 parts/etc/ 子目录中)

  • deploy.ini(或任何其他 .ini 文件;通常位于 Grok 项目的 parts/etc/ 子目录中)

当我们想要设置一个作为 paster 服务 WSGI 应用程序的 Zope 实例时,我们必须在 setup.py 中设置一个 paste.app_factory 入口点。一个最小设置可能看起来像这样:

# setup.py
from setuptools import setup, find_packages

setup(name='sampleproject',
      version='0.1dev',
      description="A sample project",
      long_description="""Without a long description.""",
      classifiers=[],
      keywords="",
      author="U.N.Owen",
      author_email="",
      url="",
      license="",
      package_dir={'': 'src'},
      packages=find_packages('src'),
      include_package_data=True,
      zip_safe=False,
      install_requires=['setuptools',],
      entry_points = """
      [paste.app_factory]
      main = grokcore.startup:application_factory
      """,
      )

在这里,paste.app_factory 入口点指向 grokcore.startup:application_factory 是重要的。

此外,我们至少需要一个最小的 buildout.cfg,它使 zc.buildout 能够为我们的实例创建控制脚本

[buildout]
develop = .
parts = app

[app]
recipe = zc.recipe.egg
eggs = sampleproject
       grokcore.startup
       Paste
       PasteScript
       PasteDeploy

在这里,如果您的应用程序不需要,则对 grokcore.startup 的 egg-entry 可能 是重要的。由 grokproject 生成的项目将自动包含此类依赖项,并且 Grok 的未来版本将自动包含 grokcore.startup,因此在此 egg 列表中不再需要 grokcore.startup

接下来,我们需要site.zcmlzope.conf文件来定义Zope实例。这些配置与是否由Paste提供服务完全独立。如果您正在升级旧Grok项目,您可以直接使用那些项目的site.zcmlzope.conf。您只需要注意可能已更改的site-definition条目在zope.conf中(见下文)。

site.zcml文件可以非常短,但在实际项目中,您当然希望这里有一些有用的内容

<configure />

用于测试的简短zope.conf文件可能如下所示

site-definition site.zcml

<zodb>
  <mappingstorage />
</zodb>

<eventlog>
  <logfile>
    path STDOUT
   </logfile>
</eventlog>

其中,site-definition条目应指向site.zcml文件的存放位置。在常规Grok项目中,这些文件被放置在项目根目录的etc/子目录中。

最后,我们必须提供一个deploy.ini(或另一个.ini文件),它告诉paster在哪里找到这些组件。在由grokproject创建的常规Grok项目中,这也被放在项目根目录的etc/子目录中

[app:main]
use = egg:sampleproject

[server:main]
use = egg:Paste#http
host = 127.0.0.1
port = 8080

[DEFAULT]
zope_conf = %(here)s/zope.conf

API 文档

application_factory(global_conf, **local_conf)

grokcore.startup提供了一个名为application_factory的函数,当用适当的配置调用时,它提供WSGIPublisherApplication实例。有关支持WSGI的Zope对象的信息,请参阅zope.app.wsgi文档

在由setuptools驱动的paster环境中,通常需要在入口点调用此函数(请参阅http://pythonpaste.org/deploy/#paste-app-factory)。

我们必须创建自己的站点定义文件——它将简单地为空——以提供最小测试

>>> import os, tempfile
>>> temp_dir = tempfile.mkdtemp()
>>> sitezcml = os.path.join(temp_dir, 'site.zcml')
>>> out = open(sitezcml, 'w')
>>> _ = out.write('<configure />')
>>> out.close()

此外,我们创建一个Zope配置文件,它也非常简单

>>> zope_conf = os.path.join(temp_dir, 'zope.conf')
>>> out = open(zope_conf, 'w')
>>> _ = out.write('''
... site-definition %s
...
... <zodb>
...   <mappingstorage />
... </zodb>
...
... <eventlog>
...   <logfile>
...     path STDOUT
...   </logfile>
... </eventlog>
... ''' % sitezcml)
>>> out.close()

现在我们可以调用application_factory来获取一个WSGI应用

>>> from grokcore.startup import application_factory
>>> app_factory = application_factory({'zope_conf': zope_conf})
>>> app_factory
<zope.app.wsgi.WSGIPublisherApplication object at 0x...>

debug_application_factory(global_conf, **local_conf)

还有一个可用于调试应用程序的应用程序工厂,尤其是在使用z3c.evalexception中间件时。

在调试Zope时,Zope被指示不自己处理任何抛出的异常。然后z3c.evalexception中间件捕获异常,并在web浏览器中提供一个用于调试的用户界面。

结果,包括IUnauthorized异常在内的所有类型的异常都不会被Zope处理,并且Zope的认证机制不会被触发。因此,在调试时无法登录。

debug_application_factory函数接受“exempt-exceptions”配置选项。此选项的值应为逗号分隔的列表,列出了每个应该由Zope继续处理而不是重新抛出以由中间件捕获的异常的点分名称。

>>> from grokcore.startup import debug_application_factory
>>> app_factory = debug_application_factory({'zope_conf': zope_conf})
>>> app_factory
<zope.app.wsgi.WSGIPublisherApplication object at 0x...>
>>> from zope.interface import implementer
>>> from zope.security.interfaces import IUnauthorized
>>> @implementer(IUnauthorized)
... class UnauthorizedException(object):
...     pass
>>>
>>> from zope.component import queryAdapter
>>> from zope.publisher.interfaces import IReRaiseException

由于没有传递“exempt-execptions”配置选项,因此没有为任何类型的异常(包括IUnauthorized)注册IReRaiseException适配器。

>>> error = UnauthorizedException()
>>> reraise = queryAdapter(error, IReRaiseException, default=None)
>>> reraise is None
True

当传递此选项时,将注册适配器。调用此适配器将返回False,告诉Zope不要重新抛出此特定异常。

>>> app_factory = debug_application_factory(
...     {'zope_conf': zope_conf},
...     **{'exempt-exceptions': 'zope.security.interfaces.IUnauthorized'})
>>>
>>> reraise = queryAdapter(error, IReRaiseException, default=None)
>>> reraise is None
False
>>> reraise()
False

清理temp_dir

>>> import shutil
>>> shutil.rmtree(temp_dir)

interactive_debug_prompt(zope_conf_path)

启动一个交互式控制台,带有调试shell。

当前,grokcore.startup提供了两种不同的调试器:一个是基于zope.app.debug的简单调试器,另一个是更强大的IPython调试器。如果环境中已安装IPython,IPython调试器将自动启用。

您可以通过以下方式显式启用IPython调试器:

grokcore.startup [debug]

在您的setup.py的安装需求中,可能只需将[debug]添加到已存在的grokcore.startup条目中。别忘了之后重新运行buildout

您可以通过以下方式显式要求使用一个或另一个调试器:

grokcore.startup.startup.interactive_debug_prompt(zope_conf)

grokcore.startup.debug.ipython_debug_prompt(zope_conf)

在您的buildout.cfg中的[interactive_debugger]部分。

>>> import zope.app.appsetup.appsetup
>>> zope.app.appsetup.appsetup._configured = False
>>> temp_dir = tempfile.mkdtemp()
>>> sitezcml = os.path.join(temp_dir, 'site.zcml')
>>> out = open(sitezcml, 'w')
>>> _ = out.write(
...    """<configure xmlns="http://namespaces.zope.org/zope">
...   <include package="zope.component" file="meta.zcml"/>
...   <include package="zope.component"/>
...   <include package="zope.traversing"/>
...   <include package="zope.security" file="meta.zcml"/>
...   <include package="zope.security"/>
...   <include package="zope.container"/>
...   <include package="zope.site"/>
...   <include package="zope.app.appsetup"/>
... </configure>""")
>>> out.close()
>>>
>>> zopeconf = os.path.join(temp_dir, 'zope.conf')
>>> out = open(zopeconf, 'w')
>>> _ = out.write("""
...     site-definition %s
...     <zodb>
...       <filestorage>
...         path %s
...       </filestorage>
...     </zodb>
...     <eventlog>
...       <logfile>
...         path STDOUT
...         formatter zope.exceptions.log.Formatter
...       </logfile>
...     </eventlog>
...     """ % (sitezcml, os.path.join(temp_dir, 'Data.fs')))
>>> out.close()
>>>
>>> import sys
>>> old_argv = sys.argv[:]
>>>
>>> script = os.path.join(temp_dir, 'script.py')
>>> out = open(script, 'w')
>>> _ = out.write(
...    """import sys
... from pprint import pprint
... pprint(debugger)
... pprint(app)
... pprint(root)
... pprint(sys.argv)
... pprint(__file__)
... pprint(__name__)""")
>>>
>>> out.close()
>>>
>>> sys.argv = ['interactive_debugger', script]
>>> from grokcore.startup import interactive_debug_prompt
>>> try:
...     interactive_debug_prompt(zopeconf)
... except SystemExit:
...     # Catch the exit from the interactive prompt as it would
...     # exit this test as well.
...     pass
------
...WARNING zope.app.appsetup Security policy is not configured.
Please make sure that securitypolicy.zcml is included in site.zcml
immediately before principals.zcml
...
<zope.app.debug.debug.Debugger object at ...>
<zope.app.debug.debug.Debugger object at ...>
<zope.site.folder.Folder object at ...>
['...script.py']
'...script.py'
'__main__'

清理temp_dir

>>> sys.argv = old_argv
>>> import shutil
>>> shutil.rmtree(temp_dir)

变更

4.1 (2024-05-22)

  • 添加对Python 3.12的支持。

  • debug.py更新为与IPython >= 8兼容。同时也要求至少这个版本的IPython。

4.0 (2023-07-14)

  • 停止对Python 2.7、3.4、3.5、3.6的支持。

  • 添加对Python 3.7、3.8、3.9、3.10、3.11的支持。

3.0.1 (2018-01-12)

  • 重新整理测试,以便Travis CI可以捕获所有功能测试。

3.0.0 (2018-01-10)

  • Python 3 兼容性。

1.2.1 (2016-02-15)

  • 更新测试。

1.2 (2012-05-02)

  • 添加了一个新的基于IPython的交互式调试器,当IPython可用时将自动使用。否则,将提供gdb风格的调试器。

1.1 (2010-10-26)

  • 停止对zdaemon的支持。

  • 通过interactive_debug_prompt执行脚本时,将显式关闭数据库。这在Windows上的测试中变得明显,因为测试会尝试删除它创建的临时目录,其中包含仍在打开的数据库文件。

1.0.2 (2010-10-05)

  • 1.0.1版本中预期的修复实际上并未包含在该版本中。我们再次进行修复。

1.0.1 (2010-08-18)

  • 当将脚本传递给interactive_debug_prompt命令时,人们会期望能够这样做:if __name__ == ‘__main__’:,然而__name__将是“__builtin__”。这已被修复。

1.0 (2010-05-20)

  • 修改interactive_debug_prompt函数,使其与“旧”的zopectl命令的行为大致相同。每当命令中传递命令行参数时,第一个参数假定是一个python脚本,该脚本将被‘execfile’d。这使得可以针对设置应用程序运行临时脚本。

  • 使包符合zope.org存储库策略。

  • 升级说明将移动到Grok升级说明中。

  • 在grokcore.startup中定义主应用程序工厂和调试应用程序工厂的入口点。

  • 使用groktoolkit。

0.4 (2009-10-06)

  • 修复文档中的错误。

0.3 (2009-10-02)

  • 添加了一个debug_application_factory函数,该函数允许使用exempt-exceptions配置选项。此选项的值应该是每个不应在调试期间重新抛出的异常的点分名称的逗号分隔列表。

    这允许IUnauthorized异常仍然由zope处理,从而使得正常的身份验证机制仍然可以工作。

  • 将versions.cfg与当前的grok versions.cfg保持一致。

0.2 (2009-02-21)

  • 使主函数在包范围内可用。

0.1 (2009-01-15)

  • 添加了对本地zope_conf参数的支持。修复https://bugs.launchpad.net/grok/+bug/320644错误。

  • 2009年1月创建grokcore.startup,通过将paster相关应用程序代码从grokcore模板中提取出来。

项目详情


下载文件

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

源代码分发

grokcore.startup-4.1.tar.gz (21.4 kB 查看哈希值)

上传时间 源代码

构建分发

grokcore.startup-4.1-py3-none-any.whl (17.6 kB 查看哈希值)

上传时间 Python 3