2016-07-15 63 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']

這不起作用,並返回MultiDict([])(試圖在中間件和views.py文件,它會返回同樣的事,這兩種情況下)。


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環境不同。

你真正要做的是創建一個自定義格式,並告訴

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

,然後設置格式:

app = WSGILogger(application, handlers, query_formatter) 

這將然而是更好的重用Apache的格式化的一個相反:

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 uery字符串。日誌消息可能有更好的格式,但這應該讓你開始。

+0

嗨,謝謝你的回覆。我編輯了我的OP並添加了更多代碼。如果還需要更多,我也會添加。 –

+0

查詢字符串在POST請求的情況下不會給我參數嗎? –

+0

它不會給你表格數據,沒有。但是查詢字符串也可以提供給POST請求**,另外還有**來組成數據。你真的想記錄POST請求嗎?它們可能包含大量數據,您必須擔心數據的編碼。例如,如果表單使用'multipart/form-data',則POST請求可以包含換行符。 –