在Flask或WSGI中打印原始HTTP请求

Spa*_*ide 36 python wsgi flask

我正在调试我构建的微控制器,它逐行写入原始HTTP请求.我正在使用Flask作为后端,我希望看到整个请求,因为它以这种格式显示:

GET / HTTP/1.1
Content-length: 123
User-agent: blah
...
Run Code Online (Sandbox Code Playgroud)

我知道Flask基于WSGI.反正有没有让它与Flask一起工作?

Mar*_*ers 43

是的,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)
Run Code Online (Sandbox Code Playgroud)

这定义了一个用于包装Flask应用程序的中间件.优点是它完全独立于Flask运行,让您无需过滤即可了解进入的内容和出现的内容.

如何应用中间件取决于您使用的确切WSGI服务器; 查看您的WSGI服务器文档.

使用内置服务器(app.run())运行Flask时,请执行以下操作:

if __name__ == '__main__':
    app.wsgi_app = LoggingMiddleware(app.wsgi_app)
    app.run()
Run Code Online (Sandbox Code Playgroud)

app.wsgi_app包装舞蹈LoggingMiddleware围绕着Flask WSGI应用程序.

输出转到wsgi.error流; 最终的结果取决于您的WSGI服务器; mod_wsgi将此信息放入您网站的Apache错误日志中,捆绑的Flask服务器将其打印到stderr.


jky*_*sam 28

使用flask,您可以访问包含所有HTTP详细信息的请求对象:

from flask import request

@app.route('/')
def index():
    print request.headers
Run Code Online (Sandbox Code Playgroud)

  • 这只打印标题,而不是指定的所有HTTP细节.使用请求的其他属性也没有帮助(例如数据,表单,值等).要完整地打印HTTP请求,请在@martinpieters的答案中包含WSGI,这是可行的方法. (20认同)

Nav*_*ava 17

假如你想要完整的细节,

还有另一种方式

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

  • 实际上这似乎确实有效。当我在导入 `pprint` 后执行 `pprint.pformat(request.__dict__, depth=5))` 时,我看到 `environ` 作为打印出来的第一个键。 (4认同)

Jen*_*man 13

你可能想要类似的东西

print(request.headers)
print(request.cookies)
print(request.data)
print(request.args)
print(request.form)
print(request.endpoint)
print(request.method)
print(request.remote_addr)
Run Code Online (Sandbox Code Playgroud)


And*_*son 5

这不使用flask,但设置套接字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()
Run Code Online (Sandbox Code Playgroud)


gec*_*kos 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.
Run Code Online (Sandbox Code Playgroud)

我使用了标头,但您可以使用相同的方法来打印任何请求属性。这些文档在这里:http : //flask.pocoo.org/docs/0.12/api/#flask.Request

另外,您还需要将FLASK_DEBUG = 1设置为Flask.logger.debug才能起作用,这很好,因为您可以在生产中禁用它。

问候,