Подтвердить что ты не робот

Печатать необработанный HTTP-запрос в Flask или WSGI

Я отлаживаю микроконтроллер, который я построил, который строит прямые HTTP-запросы. Я использую Flask для моего backend, и я хотел бы видеть весь запрос, как он появляется в этом формате:

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

Я знаю, что Flask основан на WSGI. Есть ли способ заставить это работать с Flask?

4b9b3361

Ответ 1

С флягой у вас есть доступ к объекту запроса, который содержит все данные HTTP:

from flask import request

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

Ответ 2

Да, 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 вокруг приложения WSKI Flask.

Выход идет в поток wsgi.error; где это снова будет зависеть от вашего сервера WSGI; mod_wsgi помещает это в журнал ошибок Apache для вашего сайта, входящий в комплект фласковый сервер печатает это на stderr.

Ответ 3

предположим, что если вы хотите получить полную информацию,

Есть другой способ

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

Ответ 4

Это не использует колбу, но довольно просто настроить сервер эхо-сокетов.

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

Почему нет?

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.Request.

Также вам нужно настроить FLASK_DEBUG = 1 для Flask.logger.debug, чтобы работать, что приятно, так как вы можете отключить его в работе.

С Уважением,