SDK de servidor de Configuración de apps para Python
El servicio App Configuration proporciona el SDK para integrarse con la aplicación Phyton.
Integración del SDK de servidor para Python
El servicio App Configuration proporciona el SDK para integrarse con la aplicación Phyton. Puede evaluar los valores del distintivo de característica o propiedad integrando el SDK de App Configuration.
-
Utilice uno de los métodos siguientes para instalar el SDK:
Utilizando
pippip install --upgrade ibm-appconfiguration-python-sdkUtilizando
easy_installeasy_install --upgrade ibm-appconfiguration-python-sdk -
En el código de la aplicación Python, incluya el módulo SDK con:
from ibm_appconfiguration import AppConfiguration, Feature, Property, ConfigurationType -
Inicialice el sdk para conectarse con la instancia de servicio de App Configuration.
appconfig_client = AppConfiguration.get_instance() appconfig_client.init(region='region', guid='guid', apikey='apikey') appconfig_client.set_context(collection_id='airlines-webapp', environment_id='dev')Donde:
region: Nombre de la región donde se crea la instancia del servicio App Configuration. Consulte aquí la lista de lugares compatibles. Por ejemplo:us-south,au-syd, etc.guid: GUID del servicio App Configuration. Obténgalo de la sección de credenciales de servicio del panel de control de servicio de App Configuration.apikey: ApiKey del servicio App Configuration. Obténgalo de la sección de credenciales de servicio del panel de control de servicio de App Configuration.collection_id: ID de la colección creada en la instancia de servicio App Configuration.environment_id: ID del entorno creado en la instancia de servicio App Configuration.
En
init()yset_context()son los métodos de inicialización y deben invocarse una sola vez utilizando appconfig_client. El appconfig_client, cuando se inicializa, se puede obtener entre módulos utilizandoAppConfiguration.get_instance(). Para obtener más información, consulte Captación de appconfig_client en otros módulos.
Utilización de puntos finales privados
Establezca el SDK para conectarse al servicio App Configuration utilizando un punto final privado al que solo se puede acceder a través de la red privada IBM Cloud.
appconfig_client.use_private_endpoint(True);
Esto debe hacerse antes de llamar a la función init en el SDK.
Opción para utilizar una memoria caché persistente para la configuración
Para que su aplicación y el SDK continúen funcionando incluso durante el improbable escenario de una caída del servicio App Configuration, a través del reinicio de su aplicación, puede configurar el SDK para que funcione utilizando una caché persistente. El SDK utiliza la memoria caché persistente para almacenar los datos de App Configuration que están disponibles tras reinicios de la aplicación.
# 1. default (without persistent cache)
appconfig_client.set_context(collection_id='airlines-webapp', environment_id='dev')
# 2. optional (with persistent cache)
appconfig_client.set_context(collection_id='airlines-webapp', environment_id='dev', options={
'persistent_cache_dir': '/var/lib/docker/volumes/'
})
Donde:
-
persistent_cache_dir: Ruta absoluta a un directorio que tiene permisos de lectura y escritura para el usuario. El SDK crea un archivo -appconfiguration.jsonen el directorio especificado, y se utiliza como caché persistente para almacenar la información del servicio App Configuration.Cuando la caché persistente está activada, el SDK mantiene la última configuración buena conocida en la caché persistente. Si no se puede acceder al servidor App Configuration, se cargan las últimas configuraciones en la caché persistente para que la aplicación siga funcionando.
Asegúrese de que el archivo de memoria caché creado en el directorio especificado no se pierda ni se suprima en ningún caso. Por ejemplo, considere el caso cuando se reinicia un pod de kubernetes y el archivo de memoria caché (appconfiguration.json)
se ha almacenado en un volumen efímero del pod. A medida que se reinicia el pod, kubernetes destruye el volumen efermal en el pod, como resultado se suprime el archivo de memoria caché. Por lo tanto, asegúrese de que el archivo de memoria
caché creado por el SDK siempre se almacena en el volumen persistente proporcionando la vía de acceso absoluta correcta del directorio persistente.
Opciones fuera de línea
El SDK también está diseñado para servir configuraciones y realizar evaluaciones de propiedades y distintivos de características sin estar conectado al servicio App Configuration.
appconfig_client.set_context(collection_id='collection_id', environment_id='environment_id', options={
'bootstrap_file': 'saflights/flights.json',
'live_config_update_enabled': False
})
Donde:
bootstrap_file: Ruta absoluta del archivo JSON, que contiene detalles de configuración. Asegúrese de proporcionar un archivo JSON adecuado. Puede generar este archivo mediante el comandoibmcloud ac exportde la CLI IBM Cloud App Configuration.live_config_update_enabled: Actualización en directo de la configuración desde el servidor. Establezca este valor enFalsesi los nuevos valores de configuración no deben obtenerse del servidor. De forma predeterminada, este valor se establece en True.
Ejemplos para utilizar API relacionadas con propiedades y características
Consulte los ejemplos especificados para utilizar las API relacionadas con propiedades y características.
Obtener una única característica
feature = appconfig_client.get_feature('online-check-in') # feature can be None incase of an invalid feature id
if feature is not None:
print(f'Feature Name : {0}'.format(feature.get_feature_name()))
print(f'Feature Id : {0}'.format(feature.get_feature_id()))
print(f'Feature Data Type : {0}'.format(feature.get_feature_data_type()))
if feature.is_enabled():
# feature flag is enabled
else:
# feature flag is disabled
Obtener todas las características
features_dictionary = appconfig_client.get_features()
Evaluación de características
Puede utilizar el método feature.get_current_value(entity_id, entity_attributes) para evaluar el valor del indicador de característica. Este método devuelve uno de los valores Habilitado o Inhabilitado o Alterado basándose en
la evaluación. El tipo de datos del valor devuelto coincide con el del distintivo de característica.
entity_id = "john_doe"
entity_attributes = {
'city': 'Bangalore',
'country': 'India'
}
feature_value = feature.get_current_value(entity_id=entity_id, entity_attributes=entity_attributes)
-
entity_id: ID de la entidad. Se trata de un identificador de serie relacionado con la entidad con la que se evalúa la característica. Por ejemplo, una entidad puede ser una instancia de una app que se ejecuta en un dispositivo móvil, un microservicio que se ejecuta en la nube o un componente de infraestructura que ejecuta dicho microservicio. Para que cualquier entidad interactúe con App Configuration, debe proporcionar un ID de entidad exclusivo. -
entity_attributes: un objeto JSON que consta del nombre de atributo y sus valores que definen la entidad especificada. Este es un parámetro opcional si el distintivo de característica no está configurado con ninguna definición de destino. Si el destino está configurado, se debe proporcionarentity_attributespara la evaluación de regla. Un atributo es un parámetro que se utiliza para definir un segmento. El SDK utiliza los valores de atributo para determinar si la entidad especificada cumple las reglas de destino y devuelve el valor de distintivo de característica adecuado.
Obtener una única propiedad
property = appconfig_client.get_property('check-in-charges') # property can be None incase of an invalid property id
if property is not None:
print(f'Property Name : {0}'.format(property.get_property_name()))
print(f'Property Id : {0}'.format(property.get_property_id()))
print(f'Property Data Type : {0}'.format(property.get_property_data_type()))
Obtener todas las propiedades
properties_dictionary = appconfig_client.get_properties()
Evaluación de propiedades
Puede utilizar el método property.get_current_value(entity_id=entity_id, entity_attributes=entity_attributes) para evaluar el valor de la propiedad. Este método devuelve el valor de propiedad predeterminado o su valor alterado
temporalmente basándose en la evaluación. El tipo de datos del valor devuelto coincide con el de la propiedad.
entity_id = "john_doe"
entity_attributes = {
'city': 'Bangalore',
'country': 'India'
}
property_value = property.get_current_value(entity_id=entity_id, entity_attributes=entity_attributes)
-
entity_id: ID de la entidad. Se trata de un identificador de serie relacionado con la entidad con la que se evalúa la propiedad. Por ejemplo, una entidad puede ser una instancia de una app que se ejecuta en un dispositivo móvil, un microservicio que se ejecuta en la nube o un componente de infraestructura que ejecuta dicho microservicio. Para que cualquier entidad interactúe con App Configuration, debe proporcionar un ID de entidad exclusivo. -
entity_attributes: un objeto JSON que consta del nombre de atributo y sus valores que definen la entidad especificada. Este es un parámetro opcional si la propiedad no está configurada con ninguna definición de destino. Si el destino está configurado, se debe proporcionarentity_attributespara la evaluación de regla. Un atributo es un parámetro que se utiliza para definir un segmento. El SDK utiliza los valores de atributo para determinar si la entidad especificada cumple las reglas de destino y devuelve el valor de propiedad adecuado.
Captación de appconfig_client en otros módulos
Cuando se inicializa el SDK, el appconfig_client se puede obtener a través de otros módulos como se muestra:
# **other modules**
from ibm_appconfiguration import AppConfiguration
appconfig_client = AppConfiguration.get_instance()
feature = appconfig_client.get_feature('online-check-in')
enabled = feature.is_enabled()
feature_value = feature.get_current_value(entity_id, entity_attributes)
Tipos de datos soportados
Puede configurar propiedades y distintivos de características con el servicio App Configuration, dando soporte a los siguientes tipos de datos: Booleano, Numérico y Serie. El tipo de datos Serie puede tener el formato de una serie de texto, JSON o YAML. El SDK procesa cada formato tal como se muestra en la tabla.
| Valor de característica o propiedad | Tipo de datos | Formato de datos | Tipo de datos devueltos por GetCurrentValue() |
Salida de ejemplo |
|---|---|---|---|---|
true |
BOOLEANO | No aplicable | bool |
true |
25 |
NUMERIC | No aplicable | int |
25 |
| "un texto de serie" | STRING | TEXT | string |
a string text |
{"firefox": {"name": "Firefox","pref_url": "about:config"}} |
STRING | JSON | Dictionary or List of Dictionary |
{'firefox': {'name': 'Firefox', 'pref_url': 'about:config'}} |
men:- John Smith- Bill Joneswomen:- Mary Smith- Susan Williams |
STRING | YAML | Dictionary |
{'men': ['John Smith', 'Bill Jones'], 'women': ['Mary Smith', 'Susan Williams']} |
Distintivo de característica
feature = appconfig_client.get_feature('json-feature')
feature.get_feature_data_type() // STRING
feature.get_feature_data_format() // JSON
feature.get_current_value(entityId, entityAttributes) // returns single dictionary object or list of dictionary object
// Example Below
// input json :- [{"role": "developer", "description": "do coding"},{"role": "tester", "description": "do testing"}]
// expected output :- "do coding"
tar_val = feature.get_current_value(entityId, entityAttributes)
expected_output = tar_val[0]['description']
// input json :- {"role": "tester", "description": "do testing"}
// expected output :- "tester"
tar_val = feature.get_current_value(entityId, entityAttributes)
expected_output = tar_val['role']
feature = appconfig_client.getFeature('yaml-feature')
feature.get_feature_data_type() // STRING
feature.get_feature_data_format() // YAML
feature.get_current_value(entityId, entityAttributes) // returns dictionary object
// Example Below
// input yaml string :- "---\nrole: tester\ndescription: do_testing"
// expected output :- "do_testing"
tar_val = feature.get_current_value(entityId, entityAttributes)
expected_output = tar_val['description']
Propiedad
property = appconfig_client.get_property('json-property')
property.get_property_data_type() // STRING
property.get_property_data_format() // JSON
property.get_current_value(entityId, entityAttributes) // returns single dictionary object or list of dictionary object
// Example Below
// input json :- [{"role": "developer", "description": "do coding"},{"role": "tester", "description": "do testing"}]
// expected output :- "do coding"
tar_val = property.get_current_value(entityId, entityAttributes)
expected_output = tar_val[0]['description']
// input json :- {"role": "tester", "description": "do testing"}
// expected output :- "tester"
tar_val = property.get_current_value(entityId, entityAttributes)
expected_output = tar_val['role']
property = appconfig_client.get_property('yaml-property')
property.get_property_data_type() // STRING
property.get_property_data_format() // YAML
property.get_current_value(entityId, entityAttributes) // returns dictionary object
// Example Below
// input yaml string :- "---\nrole: tester\ndescription: do_testing"
// expected output :- "do_testing"
tar_val = property.get_current_value(entityId, entityAttributes)
expected_output = tar_val['description']
Establecer escucha para los cambios de datos de propiedades y propiedades
El SDK proporciona un mecanismo para notificarle en tiempo real cuando cambia la configuración de las propiedades o los indicadores de características. Puedes suscribirte a los cambios de configuración utilizando el mismo appconfig_client.
def configuration_update(self):
print('Received updates on configurations')
# **add your code**
# To find the effect of any configuration changes, you can call the feature or property related methods
# feature = appconfig_client.getFeature('online-check-in')
# new_value = feature.get_current_value(entity_id, entity_attributes)
appconfig_client.register_configuration_update_listener(configuration_update)
Obtener datos más recientes
appconfig_client.fetch_configurations()