web-dev-qa-db-ja.com

生のHTTPリクエストをFlaskまたはWSGIで出力

生のHTTPリクエストを行ごとに書いている、私が構築したマイクロコントローラーをデバッグしています。私はバックエンドにFlaskを使用していますが、この形式で表示されるリクエスト全体を確認したいと思います。

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

FlaskはWSGIに基づいています。これをFlaskで動作させる方法はありますか?

35
Sparrowcide

flaskを使用すると、すべてのHTTP詳細を含むリクエストオブジェクトにアクセスできます。

from flask import request

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

はい、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サーバーのドキュメントを参照してください。

ビルトインサーバー(app.run())でFlaskを実行する場合、次の操作を行います。

_if __== '__main__':
    app.wsgi_app = LoggingMiddleware(app.wsgi_app)
    app.run()
_

小さな_app.wsgi_app_ラッピングダンスは、Flask WSGIアプリケーションの周りにLoggingMiddlewareを配置します。

出力は_wsgi.error_ストリームに送られます。それが再び終わる場所は、WSGIサーバーによって異なります。 _mod_wsgi_はこれをサイトのApacheエラーログに記録し、バンドルされたFlaskサーバーはこれをstderrに出力します。

37
Martijn Pieters

完全な詳細が必要な場合、

別の方法があります

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

これはflaskを使用しませんが、 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()
5
Andrew Johnson

何故なの?

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に設定して動作させる必要があります。実稼働環境では無効にできるため、これは素晴らしいことです。

よろしく、

5
geckos