Печать необработанного HTTP-запроса во Flask или WSGI
Я отлаживаю созданный мной микроконтроллер, который записывает необработанные HTTP-запросы построчно. Я использую Flask для своего бэкэнда, и я хотел бы видеть весь запрос, как он выглядит в этом формате:
GET / HTTP/1.1
Content-length: 123
User-agent: blah
...
Я знаю, что Flask основан на WSGI. Есть ли способ заставить это работать с Flask?
5 ответов
С помощью flask у вас есть доступ к объекту запроса, который содержит все детали HTTP:
from flask import request
@app.route('/')
def index():
print request.headers
Да, Flask - это приложение WSGI, поэтому тривиально обернуть ваше приложение в дополнительный слой, который регистрирует запрос:
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)
Это определяет часть промежуточного программного обеспечения для упаковки вашего приложения Flask. Преимущество состоит в том, что оно работает полностью независимо от Flask, что дает вам нефильтрованное понимание того, что входит и что выходит.
Способ применения промежуточного программного обеспечения зависит от того, какой именно сервер WSGI вы используете; см. документацию вашего сервера WSGI.
При запуске Flask со встроенным сервером (app.run()
), делать:
if __name__ == '__main__':
app.wsgi_app = LoggingMiddleware(app.wsgi_app)
app.run()
Немного app.wsgi_app
обертывание танцевальных мест LoggingMiddleware
вокруг приложения Flask WSGI.
Выход идет на wsgi.error
поток; где это снова заканчивается, зависит от вашего сервера WSGI; mod_wsgi
помещает это в журнал ошибок Apache для вашего сайта, а сервер Flask в комплекте выводит это на stderr
,
Предположим, если вы хотите полную информацию,
Есть другой способ
@app.route('/')
def index():
print request.__dict__
#this prints all variables in `dict` format including `headers`
Почему бы и нет?
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.
Я использовал заголовки, но вы можете использовать тот же подход для печати любого атрибута запроса. Документы находятся здесь: http://flask.pocoo.org/docs/0.12/api/.
Также вам нужно настроить FLASK_DEBUG=1 для Flask.logger.debug, чтобы работать, что приятно, так как вы можете отключить его в работе.
С Уважением,
Ты , наверное, хочешь что-то вроде
print(request.headers)
print(request.data)
print(request.args)
print(request.form)
print(request.endpoint)
print(request.method)
print(request.remote_addr)
Это не использует колбу, но довольно просто настроить эхо-сервер сокета.
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()
Если вы используете регистратор, я нашел это полезным
https://docs.python.org/3/library/pprint.html
from pprint import pformat
import requests
log.debug(pformat(request.headers))