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?
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
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
.
supposons que si vous voulez des détails complets,
@app.route('/')
def index():
print request.__dict__
#this prints all variables in `dict` format including `headers`
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()
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,