2017-01-11 2 views
0

Das Folgende ist aus Anfragen Erweiterte Nutzungs:Python requests.Session .__ init() __ Halterungen HTTPAdapter zweimal

Anfragen Schiffe mit einem einzigen Transport-Adapter, der HTTPAdapter. Dieser Adapter bietet die standardmäßige Requests-Interaktion mit HTTP und HTTPS mithilfe der leistungsstarken urllib3-Bibliothek. Wenn eine Anforderungssitzung initialisiert wird, wird eine davon an das Session-Objekt für HTTP, und eine für HTTPS angehängt.

Der Mount-Aufruf registriert eine bestimmte Instanz eines Transportadapters unter ein Präfix. Nach dem Anhängen verwendet jede HTTP-Anfrage, die mit dieser Sitzung erstellt wurde und deren URL mit dem angegebenen Präfix beginnt, den angegebenen Transportadapter.

  1. Wenn ich einen benutzerdefinierten Transport-Adapter, mit anderen Worten eine HTTPAdapter mit seinen eigenen Satz von retry_codes und retry_max versucht, wäre es nicht besser, auszuhängen alle montiert bestehenden HTTPAdapters vor der Montage eines neuen benutzerdefinierten Adapter montieren wollte ?
  2. Gibt es eine Möglichkeit, einen Transportadapter wie HTTPAdapter genau zu verfolgen, z. B. mit welchem ​​retry_code es erneut versucht wird und welche Anzahl von Wiederholungsversuchen durchgeführt wird?

Dank

Antwort

1

Die session.mount Methode wird verwendet, um den Wörterbuch-Index für das Präfix in der Eigenschaft session.adapters einzustellen. Die Standardsitzung will mount 2 adapters. Sie können eine neue Klasse basierend auf HTTPAdapter implementieren, um das von Ihnen geforderte Verhalten zu erreichen. Da die Wiederholungslogik in der send() - Methode behandelt wird, könnten Sie die send-Methode der Basisklasse aufrufen, RetyError-Ausnahmen abfangen und sie separat behandeln.

import requests 


class CustomAdapter(requests.adapters.HTTPAdapter): 
    # custom __init__? 
    def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): 
     try: 
      requests.adapters.HTTPAdapter.send(self, request, stream, timeout, verify, cert, proxies) 
     except requests.exceptions.RetryError: 
      # do your thing 


def load_custom(session): 
    session.adapters['http://'] = CustomAdapter() 

Blick auf die Exception handling code in requests und auch die requests_mock Implementierung für Beispiele

Verwandte Themen