Печать необработанного 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))
Другие вопросы по тегам