Esta página se aplica a Apigee y Apigee Hybrid.
Consulta la documentación de Apigee Edge.
Qué
La política de secuencia de comandos de Python te permite agregar funciones personalizadas de Python a tu flujo de proxy de API, en particular, cuando las funciones que necesitas no son proporcionadas por las políticas listas para usar de Apigee.
Esta política es una política extensible, y el uso de esta política puede tener implicaciones de costo o uso, según tu licencia de Apigee. Para obtener información sobre los tipos de políticas y sus implicaciones de uso, consulta Tipos de políticas.
La compatibilidad con el lenguaje Python se proporciona a través de la versión 2.5.2 de Jython. Las bibliotecas de terceros que agregues deben ser “Python puro” (solo implementado en Python). Para obtener más información sobre cómo agregar bibliotecas, consulta Archivos de recursos.
Una política de Python no contiene código real. En su lugar, una política de Python hace referencia a un recurso de Python y define el paso en el flujo de API en el que se ejecuta la secuencia de comandos de Python. Puedes subir tu secuencia de comandos a través del editor de proxy de la IU de Apigee o incluirla en el directorio /resources/py
en los proxies de API que desarrollas de forma local.
Ejemplos
Política y secuencia de comandos de Python
Política de secuencia de comandos de Python
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Script name="Python-1"> <DisplayName>Python-1</DisplayName> <ResourceURL>py://myscript.py</ResourceURL> </Script>
En este ejemplo, el elemento, ResourceURL especifica el recurso de secuencia de comandos de Python correspondiente.
Secuencia de comandos de Python
Aquí se muestra lo que podrías incluir en la secuencia de comandos de 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)
Referencia del elemento
<?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>
En la siguiente tabla, se describen los atributos que son comunes a todos los elementos principales de las políticas:
Atributo | Descripción | Configuración predeterminada | Presence |
---|---|---|---|
name |
El nombre interno de la política. El valor del atributo De forma opcional, usa el elemento |
N/A | Obligatorio |
continueOnError |
Configúralo como Configúralo como |
false | Opcional |
enabled |
Configúralo como Configúralo como |
true | Opcional |
async |
Este atributo dejó de estar disponible. |
false | Obsoleto |
Elemento <DisplayName>
Se usan además del atributo name
para etiquetar la política en el editor de proxy de la IU de administración con un nombre de lenguaje natural diferente.
<DisplayName>Policy Display Name</DisplayName>
Configuración predeterminada |
N/A Si omites este elemento, se usa el valor del atributo |
---|---|
Presence | Opcional |
Tipo | String |
Elemento <ResourceURL>
Este elemento especifica el archivo principal de Python que se ejecutará en el flujo de la API. Puedes almacenar este archivo en el permiso del proxy de API (en /apiproxy/resources/py
en el paquete del proxy de API o en la sección de secuencias de comandos del panel de navegación del editor de proxy de API), o en los permisos de la organización o del entorno para volver a utilizarse en múltiples proxies de API, como se describe en Archivos de recursos. Tu código puede usar los objetos, los métodos y las propiedades del modelo de objetos de JavaScript.
<ResourceURL>py://myscript.py</ResourceURL>
Predeterminado: | Ninguno |
Presencia: | Obligatorio |
Tipo: | String |
Elemento <IncludeURL>
Especifica un archivo de Python que se cargará como dependencia al archivo principal de Python especificado con el
elemento <ResourceURL>
. Las secuencias de comandos se evaluarán en el orden
en que se incluyan en la política.
Incluye más de un recurso de dependencia de Python con elementos
<IncludeURL>
adicionales.
<IncludeURL>py://myscript_dependency.py</IncludeURL>
Predeterminado: | Ninguno |
Presencia: | Opcional |
Tipo: | String |
Códigos de error
En esta sección, se describen los códigos de falla y los mensajes de error que se muestran, y las variables de falla que establece Apigee cuando esta política activa un error. Esta información es importante para saber si estás desarrollando reglas de fallas con el propósito de manejar fallas. Para obtener más información, consulta Lo que necesitas saber sobre errores de políticas y Controla fallas.
Errores de entorno de ejecución
Estos errores pueden producirse cuando se ejecuta la política.
Código de falla | Estado de HTTP | Causa | Corregir |
---|---|---|---|
steps.script.ScriptEvaluationFailed |
500 |
La política de PythonScript puede arrojar varios tipos diferentes de errores de ScriptExecutionFailed. Los tipos de errores más comunes que aparecen son NameError y ZeroDivisionError. | build |
Errores en la implementación
Estos errores pueden generarse cuando implementas un proxy que contiene esta política.
Nombre del error | Causa | Corregir |
---|---|---|
InvalidResourceUrlFormat |
Si el formato de la URL del recurso especificado en elemento <ResourceURL> o <IncludeURL> de la política de PythonScript no es válida, la implementación del proxy de la API falla. |
build |
InvalidResourceUrlReference |
Si los elementos <ResourceURL> o <IncludeURL> hacen referencia a un archivo de PythonScript que no existe, la implementación del proxy de API falla.
El archivo de origen al que se hace referencia debe existir a nivel de proxy de API, entorno u organización. |
build |
Variables con fallas
Estas variables se configuran cuando esta política activa un error en el entorno de ejecución. Para obtener más información, consulta Qué debes saber sobre los errores de la política.
Variables | Donde | Ejemplo |
---|---|---|
fault.name="fault_name" |
fault_name es el nombre de la falla, como se indica en la tabla de Errores del entorno de ejecución anterior. El nombre de la falla es la última parte del código de la falla. | fault.name Matches "ScriptExecutionFailed" |
pythonscript.policy_name.failed |
policy_name es el nombre especificado por el usuario de la política que generó la falla. | pythonscript.PythonScript-1.failed = true |
Ejemplo de respuesta de error
{ "fault": { "faultstring": "Execution of SetResponse failed with error: Pythonscript runtime error: "ReferenceError: "status" is not defined.\"", "detail": { "errorcode": "steps.script.ScriptExecutionFailed" } } }
Ejemplo de regla de falla
<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>