2016-07-15 5 views
0

フラスコアプリケーションでwsgi-request-logger https://github.com/pklaus/wsgi-request-loggerを使用しており、要求パラメータ(つまり要求とともに送信される引数)も記録する必要があります。要求引数/フォームデータを出力または返す

のRequest.Formまたはrequest.argsを使用すると、動作しないと戻って -

のRuntimeError:要求コンテキストの外で作業します。


val['params'] = url_decode(environ.get('QUERY_STRING', '')) print val['params']

これは(それは両方のケースで同じものを返し、ミドルウェア、views.pyファイルでそれを試してみました)([])が動作してMultiDictを返していません。


if environ['REQUEST_METHOD'] == 'POST': 
    print parse_form_data(environ)[1] 

これもMultiDict []を返します。

私がここで紛失しているものは得られません。ヘルプは素晴らしいだろう。


ミドルウェアを呼び出すコード。私はミドルウェアを少し編集して、今すぐローカルクローンでテストしているように、ファイル名をrequest_logger_wsgiに変更しました。

#!flask/bin/python 
from app import app 

from request_logger_wsgi import WSGILogger, ApacheFormatters 
from logging.handlers import TimedRotatingFileHandler 


def application(environ, start_response): 
     response_body = 'The request method was %s' % environ['REQUEST_METHOD'] 
     response_body = response_body.encode('utf-8') 
     response_headers = [('Content-Type', 'text/plain'), 
          ('Content-Length', str(len(response_body)))] 
     start_response('200 OK', response_headers) 
     print response_body, "231321" 
     return [response_body] 

handlers = [ TimedRotatingFileHandler('access.log', 'd', 7) , ] 
app.wsgi_app = WSGILogger(app.wsgi_app, handlers, ApacheFormatters.format_log) 

app.run(debug=True) 

答えて

0

あなたのアプリケーションのコードをもっと投稿する必要があります。そうしないと、助けが非常に困難になります。

WSGIレイヤにFlaskのrequestオブジェクトを使用することはできません。 wsgi-request-loggerはFlaskの前で実行されるため、まだリクエストコンテキストが存在しません。

他のコードがおそらくモジュールで実行され、os.environを使用しました。これはWSGI環境とは異なります。

app = WSGILogger(application, handlers, query_formatter) 

しかし、Apacheのフォーマッタの1を再利用する方がよいでしょう:あなたが実際に何をすべきか

は、カスタムフォーマッタを作成し、

def query_formatter(status_code, environ, content_length): 
    return "{0} {1} {2}".format(dt.now().isoformat(), status_code, 
           environ.get('QUERY_STRING', '')) 

そしてフォーマッタを設定伝えることです代わりに:

import requestlogger 

def apache_query_formatter(status_code, environ, content_length): 
    return requestlogger.ApacheFormatters.format_NCSA_log(
     status_code, environ, content_length) + environ.get('QUERY_STRING', '') 

このフォーマッタは、NCSA形式を使用し、qユーリーストリング。ログメッセージにはおそらくより優れたフォーマットがありますが、これはあなたを起動させるはずです。

+0

こんにちは、お返事ありがとうございます。 OPを編集してコードを追加しました。それ以上のものが必要な場合は、それも追加します。 –

+0

POSTリクエストの場合でもクエリ文字列は引数を与えません。 –

+0

フォームデータはありません。しかし、クエリー文字列は、データを形成するために**さらに** POST要求に提供することもできます。本当にPOSTリクエストを記録しますか?それらには多くのデータが含まれている可能性があり、データのエンコーディングについて心配する必要があります。フォームが 'multipart/form-data'を使用している場合、例えばPOSTリクエストは改行を含むことができます。 –

関連する問題