生のHTTPリクエストを行ごとに書いている、私が構築したマイクロコントローラーをデバッグしています。私はバックエンドにFlaskを使用していますが、この形式で表示されるリクエスト全体を確認したいと思います。
GET / HTTP/1.1
Content-length: 123
User-agent: blah
...
FlaskはWSGIに基づいています。これをFlaskで動作させる方法はありますか?
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サーバーのドキュメントを参照してください。
ビルトインサーバー(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
に出力します。
完全な詳細が必要な場合、
@app.route('/')
def index():
print request.__dict__
#this prints all variables in `dict` format including `headers`
これは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()
何故なの?
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に設定して動作させる必要があります。実稼働環境では無効にできるため、これは素晴らしいことです。
よろしく、