打印或返回请求参数/表单数据

时间:2016-07-15 05:40:03

标签: python python-2.7 logging flask werkzeug

我在烧瓶应用程序中使用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)

1 个答案:

答案 0 :(得分: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格式并附加查询字符串。可能有更好的日志消息格式,但这应该可以让你开始。