Print raw HTTP request in Flask or WSGI

前端 未结 7 1219
名媛妹妹
名媛妹妹 2021-02-01 13:05

I am debugging a microcontroller I\'ve built which is writing raw HTTP requests line by line. I am using Flask for my backend and I would like to see the entire request as it a

相关标签:
7条回答
  • 2021-02-01 13:07

    suppose if you want complete details,

    There is an another way

    @app.route('/')
    def index():
        print request.__dict__
        #this prints all variables in `dict` format including `headers`
    
    0 讨论(0)
  • 2021-02-01 13:08

    Yes, Flask is a WSGI application, so it is trivial to wrap your app in an extra layer that logs the request:

    import pprint
    
    class LoggingMiddleware(object):
        def __init__(self, app):
            self._app = app
    
        def __call__(self, env, resp):
            errorlog = env['wsgi.errors']
            pprint.pprint(('REQUEST', env), stream=errorlog)
    
            def log_response(status, headers, *args):
                pprint.pprint(('RESPONSE', status, headers), stream=errorlog)
                return resp(status, headers, *args)
    
            return self._app(env, log_response)
    

    This defines a piece of middleware to wrap your Flask application in. The advantage is that it operates entirely independent of Flask, giving you unfiltered insight into what goes in and what comes out.

    How you apply the middleware depends on the exact WSGI server you are using; see your WSGI server documentation.

    When running Flask with the built-in server (app.run()), do:

    if __name__ == '__main__':
        app.wsgi_app = LoggingMiddleware(app.wsgi_app)
        app.run()
    

    The little app.wsgi_app wrapping dance places the LoggingMiddleware around the Flask WSGI application.

    The output goes to the wsgi.error stream; where that ends up again depends on your WSGI server; mod_wsgi puts this in the Apache error log for your site, the bundled Flask server prints this to stderr.

    0 讨论(0)
  • 2021-02-01 13:13

    This doesn't use flask but it is fairly simple to setup a socket echo server.

    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()
    
    0 讨论(0)
  • 2021-02-01 13:16

    you probably want something like

    print(request.headers)
    print(request.data)
    print(request.args)
    print(request.form)
    print(request.endpoint)
    print(request.method)
    print(request.remote_addr)
    
    0 讨论(0)
  • 2021-02-01 13:24

    if you're using a logger i found this useful

    https://docs.python.org/3/library/pprint.html#pprint.pformat

    from pprint import pformat
    import requests
    log.debug(pformat(request.headers))
    
    0 讨论(0)
  • 2021-02-01 13:29

    With flask you have access to the request object which contains all the HTTP details:

    from flask import request
    
    @app.route('/')
    def index():
        print(request.headers)
    
    0 讨论(0)
提交回复
热议问题