web-dev-qa-db-fra.com

Imprimer la requête HTTP brute dans Flask ou WSGI

Je débogue un microcontrôleur que j'ai construit qui écrit ligne par ligne les requêtes HTTP brutes. J'utilise Flask pour mon backend et je voudrais voir la demande entière telle qu'elle apparaît dans ce format:

GET / HTTP/1.1
Content-length: 123
User-agent: blah
...

Je sais Flask est basé sur WSGI. Existe-t-il un moyen pour que cela fonctionne avec Flask?

35
Sparrowcide

Avec flask vous avez accès à l'objet de requête qui contient tous les détails HTTP:

from flask import request

@app.route('/')
def index():
    print request.headers
27
jkysam

Oui, Flask est une application WSGI, il est donc trivial d'envelopper votre application dans une couche supplémentaire qui enregistre la demande:

import pprint

class LoggingMiddleware(object):
    def __init__(self, app):
        self._app = app

    def __call__(self, environ, resp):
        errorlog = environ['wsgi.errors']
        pprint.pprint(('REQUEST', environ), stream=errorlog)

        def log_response(status, headers, *args):
            pprint.pprint(('RESPONSE', status, headers), stream=errorlog)
            return resp(status, headers, *args)

        return self._app(environ, log_response)

Cela définit un middleware pour envelopper votre application Flask. L'avantage est qu'il fonctionne entièrement indépendamment de Flask, vous donnant un aperçu non filtré de ce qui entre et de ce qui sort.

La façon dont vous appliquez le middleware dépend du serveur WSGI exact que vous utilisez; consultez la documentation de votre serveur WSGI.

Lorsque vous exécutez Flask avec le serveur intégré (app.run()), faites:

if __== '__main__':
    app.wsgi_app = LoggingMiddleware(app.wsgi_app)
    app.run()

La petite danse enveloppante app.wsgi_app Place le LoggingMiddleware autour de l'application WSGI Flask WSGI).

La sortie va au flux wsgi.error; où cela finit à nouveau dépend de votre serveur WSGI; mod_wsgi Met cela dans le journal des erreurs Apache pour votre site, le serveur fourni Flask l'imprime dans stderr.

37
Martijn Pieters

supposons que si vous voulez des détails complets,

Il y a une autre façon

@app.route('/')
def index():
    print request.__dict__
    #this prints all variables in `dict` format including `headers`
15
Nava

Cela n'utilise pas flask mais il est assez simple de configurer un socket echo server .

import socket

Host = ''
port = 8888
backlog = 5
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((Host,port))
s.listen(backlog)
while 1:
    client, address = s.accept()
    data = client.recv(size)
    if data:
        client.send(data)
    client.close()
5
Andrew Johnson

Pourquoi pas?

from flask import Flask, request

app = Flask(__name__)

@app.before_request
def log_request():
    app.logger.debug("Request Headers %s", request.headers)
    return None

# The remaining application code.

J'ai utilisé les en-têtes, mais vous pouvez utiliser la même approche pour imprimer n'importe quel attribut de demande. Les documents sont ici: http://flask.pocoo.org/docs/0.12/api/#flask.Request .

Vous devez également configurer FLASK_DEBUG = 1 sur Flask.logger.debug pour fonctionner, ce qui est bien puisque vous pouvez le désactiver en production.

Cordialement,

5
geckos