Swagger-codegen: [Python] Wie können wir den Wiederholungsmechanismus für Anfragen verwenden, die über SDK gestellt werden?

Erstellt am 15. Sept. 2017  ·  3Kommentare  ·  Quelle: swagger-api/swagger-codegen

Beschreibung

Wie können wir mit python sdk den retry-Parameter / das retry-Argument im poolmanager-Objekt übergeben? Angenommen, die Anforderung dauert aus irgendeinem Grund länger als normal, und wir möchten eine Wiederholungsnummer übergeben. Können wir die von urllib3 unterstützte Wiederholungsklasse verwenden? Schätze deine Hilfe.

Swagger-Codegen-Version

2.2.3

Inhalt oder URL der Swagger-Deklarationsdatei
Python Question

Hilfreichster Kommentar

@ dnome2 Sie können über ApiClient.rest_client.pool_manager auf PoolManager zugreifen. Wenn Sie möchten, dass Änderungen auf jeden Client angewendet werden, müssen Sie ApiClient direkt erstellen und diese beim Erstellen eines neuen Clientobjekts übergeben.

Am Beispiel der Zoohandlung:

  • Wenn Sie einen neuen Client wie PetApi erstellen, wird eine eigene Instanz von ApiClient sei denn, Sie übergeben Ihre eigene über das api_client kw (als PetApi.api_client ).
  • ApiClient erstellt seine eigenen RESTClientObject (als ApiClient.rest_client )
  • RESTClientObject erstellt seine eigenen urllib3.PoolManager (als RESTClientObject.pool_manager )

Aus diesem Grund müssen Sie alle neuen Clients so einstellen, dass sie diese bestimmte ApiClient -Instanz verwenden. Wenn Sie dies nicht tun, erstellen sie ihre eigenen mit Standardeinstellungen. Ich denke, das könnte nützlich sein, wenn Sie möchten, dass verschiedene APIs unterschiedliche PoolManager-Einstellungen haben oder so.

Hier ist ein Beispiel dafür, wie Sie festlegen und sicherstellen, dass es für alle API-Clients der Zoohandlung gilt:

import swagger_client

api_client = swagger_client.ApiClient()
api_client.rest_client.pool_manager.connection_pool_kw['retries'] = 10
pet_api = swagger_client.PetApi(api_client=api_client)
user_api = swagger_client.UserApi(api_client=api_client)
store_api = swagger_client.StoreApi(api_client=api_client)

Ich habe es gerade offline getestet und überprüft, ob urllib3 10 Versuche unternommen hat, während der Standardwert 3 ist

Nebenbemerkung / Tangens : Wenn dies jedes Mal ärgerlich ist und es Ihnen nichts ausmacht, die generierte swagger_client-Bibliothek direkt zu bearbeiten, können Sie dies zum Standardverhalten machen, indem Sie ApiClient die Clients selbst instanziieren lassen und self wenn es das tut. Schnelles schmutziges Beispiel, in ApiClient.__init__ könnten Sie Folgendes tun:

from .apis import PetApi
self.pet_api = PetApi(api_client=self)

Auf diese Weise müssten Sie nur einmal ApiClient erstellen und die Poolmanager-Einstellungen aktualisieren und könnten über api_client.pet_api.find_pets_by_status('foo') auf die anderen Clients zugreifen, und alle Änderungen, die Sie später über ApiClient vornehmen, werden berücksichtigt alle ihm zugewiesenen Clients. Wenn Sie mehrere Clients erstellen, müssen Sie die Clients nicht explizit für jeden einzelnen neu festlegen

Alle 3 Kommentare

cc @taxpon @frol @mbohlool

@ dnome2 Sie können über ApiClient.rest_client.pool_manager auf PoolManager zugreifen. Wenn Sie möchten, dass Änderungen auf jeden Client angewendet werden, müssen Sie ApiClient direkt erstellen und diese beim Erstellen eines neuen Clientobjekts übergeben.

Am Beispiel der Zoohandlung:

  • Wenn Sie einen neuen Client wie PetApi erstellen, wird eine eigene Instanz von ApiClient sei denn, Sie übergeben Ihre eigene über das api_client kw (als PetApi.api_client ).
  • ApiClient erstellt seine eigenen RESTClientObject (als ApiClient.rest_client )
  • RESTClientObject erstellt seine eigenen urllib3.PoolManager (als RESTClientObject.pool_manager )

Aus diesem Grund müssen Sie alle neuen Clients so einstellen, dass sie diese bestimmte ApiClient -Instanz verwenden. Wenn Sie dies nicht tun, erstellen sie ihre eigenen mit Standardeinstellungen. Ich denke, das könnte nützlich sein, wenn Sie möchten, dass verschiedene APIs unterschiedliche PoolManager-Einstellungen haben oder so.

Hier ist ein Beispiel dafür, wie Sie festlegen und sicherstellen, dass es für alle API-Clients der Zoohandlung gilt:

import swagger_client

api_client = swagger_client.ApiClient()
api_client.rest_client.pool_manager.connection_pool_kw['retries'] = 10
pet_api = swagger_client.PetApi(api_client=api_client)
user_api = swagger_client.UserApi(api_client=api_client)
store_api = swagger_client.StoreApi(api_client=api_client)

Ich habe es gerade offline getestet und überprüft, ob urllib3 10 Versuche unternommen hat, während der Standardwert 3 ist

Nebenbemerkung / Tangens : Wenn dies jedes Mal ärgerlich ist und es Ihnen nichts ausmacht, die generierte swagger_client-Bibliothek direkt zu bearbeiten, können Sie dies zum Standardverhalten machen, indem Sie ApiClient die Clients selbst instanziieren lassen und self wenn es das tut. Schnelles schmutziges Beispiel, in ApiClient.__init__ könnten Sie Folgendes tun:

from .apis import PetApi
self.pet_api = PetApi(api_client=self)

Auf diese Weise müssten Sie nur einmal ApiClient erstellen und die Poolmanager-Einstellungen aktualisieren und könnten über api_client.pet_api.find_pets_by_status('foo') auf die anderen Clients zugreifen, und alle Änderungen, die Sie später über ApiClient vornehmen, werden berücksichtigt alle ihm zugewiesenen Clients. Wenn Sie mehrere Clients erstellen, müssen Sie die Clients nicht explizit für jeden einzelnen neu festlegen

Vielen Dank @arcward ! Werde das ausprobieren und dich wissen lassen, wenn ich irgendwelche Probleme sehe.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen