python - digitalocean - run flask as a service ubuntu
Imprimir solicitud HTTP sin formato en Flask o WSGI (5)
Estoy depurando un microcontrolador que he creado que está escribiendo solicitudes HTTP sin procesar línea por línea. Estoy usando Flask para mi back-end y me gustaría ver toda la solicitud tal como aparece en este formato:
GET / HTTP/1.1
Content-length: 123
User-agent: blah
...
Sé que Flask está basado en WSGI. ¿Hay alguna forma de hacer que esto funcione con Flask?
Con el matraz tiene acceso al objeto de solicitud que contiene todos los detalles de HTTP:
from flask import request
@app.route(''/'')
def index():
print request.headers
Esto no utiliza el matraz, pero es bastante simple configurar un servidor de socket echo .
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()
Por qué no?
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.
He usado los encabezados pero puede usar el mismo enfoque para imprimir cualquier atributo de solicitud. Los documentos están aquí: http://flask.pocoo.org/docs/0.12/api/#flask.Request .
También necesita configurar FLASK_DEBUG = 1 a Flask.logger.debug para que funcione, lo que es bueno ya que puede deshabilitarlo en producción.
Saludos,
Sí, Flask es una aplicación WSGI, por lo que es trivial envolver su aplicación en una capa adicional que registra la solicitud:
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)
Esto define una pieza de middleware para envolver su aplicación Flask. La ventaja es que opera completamente independiente de Flask, brindándole una visión sin filtro de lo que entra y lo que sale.
La forma de aplicar el middleware depende del servidor WSGI exacto que esté utilizando; vea su documentación del servidor WSGI.
Cuando ejecute Flask con el servidor integrado ( app.run()
), haga lo siguiente:
if __name__ == ''__main__'':
app.wsgi_app = LoggingMiddleware(app.wsgi_app)
app.run()
El pequeño app.wsgi_app
envoltura de app.wsgi_app
coloca el LoggingMiddleware
alrededor de la aplicación Flask WSGI.
La salida va a la secuencia wsgi.error
; donde eso termina nuevamente depende de su servidor WSGI; mod_wsgi
coloca en el registro de errores de Apache para su sitio, el servidor Flask incluido lo imprime en stderr
.
supongamos que si quieres detalles completos,
Hay otra manera
@app.route(''/'')
def index():
print request.__dict__
#this prints all variables in `dict` format including `headers`