138 votes

Enregistrer toutes les requêtes du module python-requests

J'utilise python Demandes . J'ai besoin de déboguer certains OAuth et pour cela, je voudrais qu'il enregistre toutes les requêtes effectuées. Je pourrais obtenir ces informations avec ngrep mais malheureusement, il n'est pas possible de grep les connexions https (qui sont nécessaires pour l'accès à l'Internet). OAuth )

Comment puis-je activer la journalisation de toutes les URL (+ paramètres) qui Requests est en train d'accéder ?

4voto

Kirill Points 60

Amélioration de la situation ce respuesta

C'est comme ça que ça a marché pour moi :

import logging
import sys    
import requests
import textwrap

root = logging.getLogger('httplogger')

def logRoundtrip(response, *args, **kwargs):
    extra = {'req': response.request, 'res': response}
    root.debug('HTTP roundtrip', extra=extra)

class HttpFormatter(logging.Formatter):

    def _formatHeaders(self, d):
        return '\n'.join(f'{k}: {v}' for k, v in d.items())

    def formatMessage(self, record):
        result = super().formatMessage(record)
        if record.name == 'httplogger':
            result += textwrap.dedent('''
                ---------------- request ----------------
                {req.method} {req.url}
                {reqhdrs}

                {req.body}
                ---------------- response ----------------
                {res.status_code} {res.reason} {res.url}
                {reshdrs}

                {res.text}
            ''').format(
                req=record.req,
                res=record.res,
                reqhdrs=self._formatHeaders(record.req.headers),
                reshdrs=self._formatHeaders(record.res.headers),
            )

        return result

formatter = HttpFormatter('{asctime} {levelname} {name} {message}', style='{')
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(formatter)
root.addHandler(handler)
root.setLevel(logging.DEBUG)

session = requests.Session()
session.hooks['response'].append(logRoundtrip)
session.get('http://httpbin.org')

2voto

Mike Smith Points 37

J'utilise python 3.4, demandes 2.19.1 :

'urllib3' est le logger à utiliser maintenant (et non plus 'requests.packages.urllib3'). La journalisation de base se fera toujours sans définir http.client.HTTPConnection.debuglevel.

0voto

Micael Jarniac Points 126

J'utilise un logger_config.yaml pour configurer ma journalisation, et pour que ces journaux s'affichent, tout ce que j'avais à faire était d'ajouter une balise disable_existing_loggers: False à la fin de celui-ci.

Ma configuration de la journalisation est plutôt étendue et confuse, donc je ne connais pas de bonne façon de l'expliquer ici, mais si quelqu'un utilise également un fichier YAML pour configurer sa journalisation, cela pourrait être utile.

https://docs.python.org/3/howto/logging.html#configuring-logging

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X