App Configuration-Server-SDK für Python

Der App Configuration-Service bietet SDKs für die Integration mit Ihrer Python-Anwendung an.

Server-SDK für Python integrieren

Der App Configuration-Service bietet SDKs für die Integration mit Ihrer Python-Anwendung an. Sie können die Werte Ihres Feature-Flags oder Ihrer Eigenschaft durch Integration des App Configuration SDK auswerten.

  1. Verwenden Sie eine der folgenden Methoden, um das SDK zu installieren:

    Verwendung von pip

    pip install --upgrade ibm-appconfiguration-python-sdk
    

    Verwendung von easy_install

    easy_install --upgrade ibm-appconfiguration-python-sdk
    
  2. Schließen Sie in Ihren Python-Anwendungscode das SDK-Modul ein mit:

    from ibm_appconfiguration import AppConfiguration, Feature, Property, ConfigurationType
    
  3. Initialisieren Sie das SDK, um eine Verbindung zu Ihrer App Configuration-Serviceinstanz herzustellen.

    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')
    

    Dabei gilt:

    • region: Name der Region, in der die Dienstinstanz App Configuration erstellt wird. Eine Liste der unterstützten Standorte finden Sie hier. Zum Beispiel: us-south, au-syd usw.
    • guid: GUID des Dienstes App Configuration. Rufen Sie sie im Abschnitt mit den Serviceberechtigungsnachweisen des App Configuration-Service-Dashboards ab.
    • apikey: ApiKey des Dienstes App Configuration. Rufen Sie sie im Abschnitt mit den Serviceberechtigungsnachweisen des App Configuration-Service-Dashboards ab.
    • collection_id: ID der in der Dienstinstanz App Configuration erstellten Sammlung.
    • environment_id: ID der in der Dienstinstanz App Configuration erstellten Umgebung.

    Die init() und set_context() sind die Initialisierungsmethoden und sollten nur einmal unter Verwendung von appconfig_client aufgerufen werden. Der appconfig_client kann nach der Initialisierung modulübergreifend über AppConfiguration.get_instance() abgerufen werden. Weitere Informationen finden Sie unter Appconfig_client über andere Module hinweg abrufen.

Private Endpunkte verwenden

Legen Sie das SDK für die Verbindung zum Service App Configuration fest, indem Sie einen privaten Endpunkt verwenden, auf den nur über das private Netz IBM Cloud zugegriffen werden kann.

appconfig_client.use_private_endpoint(True);

Dies muss vor dem Aufruf der Funktion init im SDK erfolgen.

Option zur Verwendung eines persistenten Caches für die Konfiguration

Damit Ihre Anwendung und Ihr SDK auch im unwahrscheinlichen Fall eines Ausfalls des App Configuration-Dienstes über den Neustart Ihrer Anwendung hinweg weiterarbeiten können, können Sie das SDK so konfigurieren, dass es mit einem dauerhaften Cache arbeitet. Das SDK verwendet den persistenten Cache zum Speichern der App Configuration-Daten, die bei den Neustarts Ihrer Anwendung verfügbar sind.

# 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/'
})

Dabei gilt:

  • persistent_cache_dir: Absoluter Pfad zu einem Verzeichnis, für das der Benutzer Lese- und Schreibrechte besitzt. Das SDK erstellt eine Datei - appconfiguration.json- in dem angegebenen Verzeichnis, die als dauerhafter Cache zum Speichern der App Configuration Dienstinformationen verwendet wird.

    Wenn der persistente Cache aktiviert ist, speichert das SDK die letzte bekannte gute Konfiguration im persistenten Cache. Wenn der Server App Configuration nicht erreichbar ist, werden die neuesten Konfigurationen aus dem persistenten Cache in die Anwendung geladen, damit diese weiterarbeiten kann.

Stellen Sie sicher, dass die im angegebenen Verzeichnis erstellte Cachedatei nicht verloren geht oder gelöscht wird. Beispiel: Angenommen, ein Kubernetes-Pod wird erneut gestartet und die Cachedatei (appconfiguration.json) wurde auf einem ephemeren Datenträger des Pods gespeichert. Wenn ein Pod erneut gestartet wird, löscht Kubernetes den ephermal-Datenträger im Pod, sodass die Cachedatei gelöscht wird. Stellen Sie sicher, dass die vom SDK erstellte Cachedatei immer im persistenten Datenträger gespeichert wird, indem Sie den richtigen absoluten Pfad des persistenten Verzeichnisses angeben.

Offline-Optionen

Das SDK ist auch für die Bereitstellung von Konfigurationen und die Durchführung von Feature-Flag-und Eigenschaftsauswertungen ohne Verbindung zum App Configuration-Service konzipiert.

appconfig_client.set_context(collection_id='collection_id', environment_id='environment_id', options={
  'bootstrap_file': 'saflights/flights.json',
  'live_config_update_enabled': False
})

Dabei gilt:

  • bootstrap_file: Absoluter Pfad der JSON-Datei, die Konfigurationsdetails enthält. Stellen Sie sicher, dass eine korrekte JSON-Datei bereitgestellt wird. Sie können diese Datei mit dem Befehl ibmcloud ac export der IBM Cloud App Configuration CLI erzeugen.
  • live_config_update_enabled: Live-Konfigurationsaktualisierung vom Server. Setzen Sie diesen Wert auf False, wenn die neuen Konfigurationswerte nicht vom Server geholt werden sollen. Standardmäßig ist dieser Wert auf „Wahr“ gesetzt.

Beispiele für die Verwendung von Funktionen und eigenschaftsbezogenen APIs

Sehen Sie sich die aufgelisteten Beispiele für die Verwendung der Funktionen und eigenschaftsbezogenen APIs an.

Einzelnes Feature abrufen

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

Alle Features abrufen

features_dictionary = appconfig_client.get_features()

Feature-Auswertung

Sie können die Methode feature.get_current_value(entity_id, entity_attributes) verwenden, um den Wert des Merkmals auszuwerten. Diese Methode gibt basierend auf der Auswertung einen der Werte "Aktiviert", "Inaktiviert" oder "Überschrieben" zurück. Der Datentyp des zurückgegebenen Werts stimmt mit dem des Feature-Flags überein.

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 der Entität. Dies ist eine Zeichenfolgekennung, die sich auf die Entität bezieht, für die das Feature ausgewertet wird. Eine Entität kann beispielsweise eine Instanz einer App sein, die auf einem mobilen Gerät ausgeführt wird, einen Mikroservice, der in der Cloud ausgeführt wird, oder eine Komponente der Infrastruktur, die diesen Mikroservice ausführt. Damit eine Entität mit App Configuration interagieren kann, muss sie eine eindeutige Entitäts-ID angeben

  • entity_attributes: Ein JSON-Objekt, das aus dem Attributnamen und ihren Werten besteht, die die angegebene Entität definieren. Dies ist ein optionaler Parameter, wenn das Feature-Flag nicht mit einer Zieldefinition konfiguriert ist. Wenn das Ziel konfiguriert ist, sollte entity_attributes für die Regelauswertung angegeben werden. Ein Attribut ist ein Parameter, der zum Definieren eines Segments verwendet wird. Das SDK verwendet die Attributwerte, um festzustellen, ob die angegebene Entität die Zielregeln erfüllt, und gibt den entsprechenden Feature-Flag-Wert zurück.

Einzeleigenschaft abrufen

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()))

Alle Eigenschaften abrufen

properties_dictionary = appconfig_client.get_properties()

Auswertung der Eigenschaft

Sie können die Methode property.get_current_value(entity_id=entity_id, entity_attributes=entity_attributes) verwenden, um den Wert der Immobilie zu ermitteln. Diese Methode gibt basierend auf der Auswertung den Standardeigenschaftswert oder den überschriebenen Wert zurück. Der Datentyp des zurückgegebenen Werts entspricht dem des Merkmals.

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 der Entität. Dies ist eine Zeichenfolgekennung, die sich auf die Entität bezieht, für die die Eigenschaft ausgewertet wird. Eine Entität kann beispielsweise eine Instanz einer App sein, die auf einem mobilen Gerät ausgeführt wird, einen Mikroservice, der in der Cloud ausgeführt wird, oder eine Komponente der Infrastruktur, die diesen Mikroservice ausführt. Damit eine Entität mit App Configuration interagieren kann, muss sie eine eindeutige Entitäts-ID angeben

  • entity_attributes: Ein JSON-Objekt, das aus dem Attributnamen und ihren Werten besteht, die die angegebene Entität definieren. Dies ist ein optionaler Parameter, wenn die Eigenschaft nicht mit einer Zieldefinition konfiguriert ist. Wenn das Ziel konfiguriert ist, sollte entity_attributes für die Regelauswertung angegeben werden. Ein Attribut ist ein Parameter, der zum Definieren eines Segments verwendet wird. Das SDK verwendet die Attributwerte, um zu bestimmen, ob die angegebene Entität die Zielregeln erfüllt, und gibt den entsprechenden Eigenschaftswert zurück.

appconfig_client über andere Module hinweg abrufen

Wenn das SDK initialisiert ist, kann der appconfig_client wie gezeigt über andere Module bezogen werden:

# **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)

Unterstützte Datentypen

Sie können Feature-Flags und -Eigenschaften mit dem App Configuration-Service konfigurieren, um die folgenden Datentypen zu unterstützen: Boolesch, Numerisch und Zeichenfolge. Der Zeichenfolgedatentyp kann das Format einer TEXT-Zeichenfolge, JSON oder YAML haben. Das SDK verarbeitet jedes Format wie in der Tabelle dargestellt.

Beispiel Outputs
Feature oder Eigenschaftswert Datentyp Datenformat Typ der von GetCurrentValue() zurückgegebenen Daten Beispielausgabe
true BOOLEAN Nicht zutreffend bool true
25 NUMERIC Nicht zutreffend int 25
"ein Zeichenfolgetext" 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 Jones
women:
- Mary Smith
- Susan Williams
STRING YAML Dictionary {'men': ['John Smith', 'Bill Jones'], 'women': ['Mary Smith', 'Susan Williams']}

Feature-Flag

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']

Eigenschaft

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']

Listener für Feature- und Eigenschaftsdatenänderungen festlegen

Das SDK bietet einen Mechanismus, um Sie in Echtzeit zu benachrichtigen, wenn sich die Konfiguration von Feature Flags oder Eigenschaften ändert. Sie können Konfigurationsänderungen abonnieren, indem Sie denselben appconfig_client verwenden.

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)

Neueste Daten abrufen

appconfig_client.fetch_configurations()