本页面适用于 Apigee 和 Apigee Hybrid。
查看 Apigee Edge 文档。
内容
通过 Python 脚本政策,您可以向 API 代理流添加自定义 Python 功能,尤其是当您需要的功能超出了 Apigee 开箱即用的政策提供的范围时。
此政策是一项可扩展政策,使用此政策可能会影响费用或使用情况,具体取决于您的 Apigee 许可。如需了解政策类型和使用情况影响,请参阅政策类型。
Python 语言支持通过 Jython 2.5.2 版提供。您添加的第三方库必须为“纯 Python”(即仅用 Python 实现的库)。 如需详细了解如何添加库,请参阅资源文件。
Python 政策不包含实际代码。相反,Python 政策会引用 Python 资源,并在执行 Python 脚本的 API 流中定义步骤。您可以通过 Apigee 界面代理编辑器上传脚本,也可以在本地开发的 API 代理中将其包含在 /resources/py
目录中。
示例
Python 政策和脚本
Python 脚本政策
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Script name="Python-1"> <DisplayName>Python-1</DisplayName> <ResourceURL>py://myscript.py</ResourceURL> </Script>
在此示例中,元素 ResourceURL 指定相关的 Python 脚本资源。
Python 脚本
它显示了 Python 脚本本身可能包含的内容。
import base64 username = flow.getVariable("request.formparam.client_id") password = flow.getVariable("request.formparam.client_secret") base64string = base64.encodestring('%s:%s' % (username, password))[:-1] authorization = "Basic "+base64string flow.setVariable("authorizationParam",authorization)
元素参考
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Script name="Python-1"> <DisplayName>Python-1</DisplayName> <ResourceURL>py://myscript.py</ResourceURL> <IncludeURL>py://myscript_dependency.py</IncludeURL> </Script>
下表介绍了所有政策父元素通用的特性:
属性 | 说明 | 默认 | Presence |
---|---|---|---|
name |
政策的内部名称。 (可选)使用 |
不适用 | 必需 |
continueOnError |
设置为 设置为 |
false | 可选 |
enabled |
设置为 设为 |
true | 可选 |
async |
此特性已弃用。 |
false | 已弃用 |
<DisplayName> 元素
用于在 name
属性之外在管理界面代理编辑器中给政策添加不同的自然语言名称标签。
<DisplayName>Policy Display Name</DisplayName>
默认 |
不适用 如果省略此元素,则会使用政策的 |
---|---|
Presence | 可选 |
类型 | 字符串 |
<ResourceURL> 元素
该元素指定将在 API 流中执行的主要 Python 文件。您可以在 API 代理范围(API 代理软件包的 /apiproxy/resources/py
下方或 API 代理编辑器导航工具窗格的“脚本”部分中)或组织或环境范围中存储此文件,以便在多个 API 代理中重复使用,如资源文件中所述。您的代码可以使用 JavaScript 对象模型的对象、方法和属性。
<ResourceURL>py://myscript.py</ResourceURL>
默认: | 无 |
状态: | 必需 |
类型: | 字符串 |
<IncludeURL> 元素
指定要作为使用 <ResourceURL>
元素指定的主要 Python 文件的依赖项加载的 Python 库文件。脚本将按政策中的列出顺序进行评估。
使用附加 <IncludeURL>
元素添加多个 Python 依赖项资源。
<IncludeURL>py://myscript_dependency.py</IncludeURL>
默认: | 无 |
状态: | 可选 |
类型: | 字符串 |
错误代码
本部分介绍当此政策触发错误时返回的故障代码和错误消息,以及由 Apigee 设置的故障变量。在开发故障规则以处理故障时,请务必了解此信息。如需了解详情,请参阅您需要了解的有关政策错误的信息和处理故障。
运行时错误
政策执行时可能会发生这些错误。
故障代码 | HTTP 状态 | 原因 | 修复 |
---|---|---|---|
steps.script.ScriptEvaluationFailed |
500 |
PythonScript 政策可能会引发几种不同的 ScriptExecutionFailed 错误。常见的错误类型包括 NameError 和 ZeroDivisionError。 | build |
部署错误
在您部署包含此政策的代理时,可能会发生这些错误。
错误名称 | 原因 | 修复 |
---|---|---|
InvalidResourceUrlFormat |
如果 PythonScript 政策的 <ResourceURL> 或 <IncludeURL> 元素中指定的资源网址格式无效,则 API 代理的部署将失败。 |
build |
InvalidResourceUrlReference |
如果 <ResourceURL> 或 <IncludeURL> 元素引用了不存在的 PythonScript 文件,则 API 代理的部署将失败。引用的源文件必须存在于 API 代理、环境或组织级别。 |
build |
故障变量
当此政策在运行时触发错误时,将设置这些变量。如需了解详情,请参阅您需要了解的有关政策错误的信息。
变量 | 位置 | 示例 |
---|---|---|
fault.name="fault_name" |
fault_name 是故障名称,如上面的运行时错误表中所列。 故障名称是故障代码的最后一部分。 | fault.name Matches "ScriptExecutionFailed" |
pythonscript.policy_name.failed |
policy_name 是抛出故障的政策的用户指定名称。 | pythonscript.PythonScript-1.failed = true |
错误响应示例
{ "fault": { "faultstring": "Execution of SetResponse failed with error: Pythonscript runtime error: "ReferenceError: "status" is not defined.\"", "detail": { "errorcode": "steps.script.ScriptExecutionFailed" } } }
故障规则示例
<FaultRule name="PythonScript Policy Faults"> <Step> <Name>AM-CustomErrorResponse</Name> <Condition>(fault.name Matches "ScriptExecutionFailed") </Condition> </Step> <Condition>(pythonscript.PythonScript-1.failed = true) </Condition> </FaultRule>