在Plone中的RestrictedPython脚本中导入ping模块

在Plone中的RestrictedPython脚本中导入ping模块,plone,ping,zope,Plone,Ping,Zope,我想从我的plone站点检查internet连接。我在python脚本中尝试了ping ## Script (Python) "pwreset_action.cpy" ##bind container=container ##bind context=context ##bind namespace= ##bind script=script ##bind subpath=traverse_subpath ##title=Reset a user's password ##parameters=

我想从我的plone站点检查internet连接。我在python脚本中尝试了ping

## Script (Python) "pwreset_action.cpy"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##title=Reset a user's password
##parameters=randomstring, userid=None, password=None, password2=None
from Products.CMFCore.utils import getToolByName
from Products.PasswordResetTool.PasswordResetTool import InvalidRequestError, ExpiredRequestError
import ping, socket



status = "success"
pw_tool = getToolByName(context, 'portal_password_reset')
try:
    pw_tool.resetPassword(userid, randomstring, password)

except ExpiredRequestError:
    status = "expired"
except InvalidRequestError:
    status = "invalid"
except RuntimeError:
    status = "invalid"

context.plone_log("TRYING TO PING")
try :



 ping.verbose_ping('www.google.com' , run=3)
   context.plone_log("PING DONE")
except socket.error, e:
    context.plone_log("PING FAILED")


return state.set(status=status)
我犯了以下错误:

2012-07-20T11:37:08 INFO SignalHandler Caught signal SIGTERM
------
2012-07-20T11:37:08 INFO Z2 Shutting down fast
------
2012-07-20T11:37:08 INFO ZServer closing HTTP to new connections
------
2012-07-20T11:37:42 INFO ZServer HTTP server started at Fri Jul 20 11:37:42 2012
    Hostname: 0.0.0.0
    Port: 8080
------
2012-07-20T11:37:42 WARNING SecurityInfo Conflicting security declarations for "setText"
------
2012-07-20T11:37:42 WARNING SecurityInfo Class "ATTopic" had conflicting security declarations
------
2012-07-20T11:37:46 INFO plone.app.theming Patched Zope Management Interface to disable theming.
------
2012-07-20T11:37:48 INFO PloneFormGen Patching plone.app.portlets ColumnPortletManagerRenderer to not catch Retry exceptions
------
2012-07-20T11:37:48 INFO Zope Ready to handle requests
------
这行不通

无法在受限Python脚本中导入任意Python模块,正如昨天告诉您的答案所示:

如果需要使用仲裁Python模块,则需要为此编写自己的Plone插件,并使用BrowserView。通过web浏览器开发受限Python是不够的:

它不起作用

无法在受限Python脚本中导入任意Python模块,正如昨天告诉您的答案所示:

如果需要使用仲裁Python模块,则需要为此编写自己的Plone插件,并使用BrowserView。通过web浏览器开发受限Python是不够的:


Zope中的Python脚本是沙盒(via),这意味着任何模块导入都必须首先声明为安全的。除非您知道自己在做什么,否则将模块添加到声明的安全列表通常是个坏主意

要将模块声明为可导入Python脚本,您需要创建一个Python包,然后向其中添加以下代码,以便在Zope启动时执行:

from Products.PythonScripts.Utility import allow_module

allow_module('ping')
这将允许从该模块进行任何导入(小心使用)

最好只允许模块中的特定方法和类;使用
ModuleSecurity
声明:

from AccessControl import ModuleSecurityInfo

ModuleSecurityInfo('ping').declarePublic('verbose_ping')
ModuleSecurityInfo('socket').declarePublic('error')
这记录在中,特别是


请注意,在不受限制的代码(例如,常规python包)中使用严格约束的方法来完成所有这些工作几乎总是一个更好的主意,然后允许从python脚本中使用该方法。

Zope中的python脚本是沙盒(via,这意味着任何模块导入都必须首先声明为安全的。除非您知道自己在做什么,否则将模块添加到声明的安全列表通常是个坏主意

要将模块声明为可导入Python脚本,您需要创建一个Python包,然后向其中添加以下代码,以便在Zope启动时执行:

from Products.PythonScripts.Utility import allow_module

allow_module('ping')
这将允许从该模块进行任何导入(小心使用)

最好只允许模块中的特定方法和类;使用
ModuleSecurity
声明:

from AccessControl import ModuleSecurityInfo

ModuleSecurityInfo('ping').declarePublic('verbose_ping')
ModuleSecurityInfo('socket').declarePublic('error')
这记录在中,特别是


请注意,在不受限制的代码(例如,常规python包)中使用严格约束的方法来完成所有这些工作几乎总是一个更好的主意,然后允许从python脚本中使用该方法。

谢谢您的回答。我刚开始使用Plone/Zope和python,所以我不太明白如何编写自己的加载项。我也不明白您所谓的“任意python模块”是什么意思。如果您知道任何可以帮助我的教程…在高效定制Plone之前,您应该先掌握Python基础知识。如果您对Python、Plone或软件开发非常陌生,建议您在尝试开发自己的解决方案之前先阅读专业的Plone 4开发书籍。确保您也掌握了generic Python在迁移到Plone之前,实际上,如果您首先声明任意Python模块是安全的,那么您可以导入它们。谢谢您的回答。我刚开始使用Plone/Zope和Python,所以我不太明白如何编写自己的附加组件。我也不明白您称之为“任意Python模块”是什么。如果您知道任何可以帮助我的教程…在高效定制Plone之前,您应该先掌握Python基础知识。如果您对Python、Plone或软件开发非常陌生,建议您在尝试开发自己的解决方案之前先阅读专业的Plone 4开发书籍。确保您也掌握了generic Python在迁移到Plone之前,如果您首先声明Python模块是安全的,那么您可以导入任意Python模块。您包括了正常日志输出,其中没有错误。:-)您包括了正常日志输出,其中没有错误。:-)谢谢你的回答。实际上,我尝试做的是SOAP连接。我尝试ping只是为了检查我是否可以访问internet。谢谢你的回答。实际上,我尝试做的是SOAP连接。我尝试ping只是为了检查我是否可以访问internet。