我在烧瓶应用程序中使用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 :(得分: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格式并附加查询字符串。可能有更好的日志消息格式,但这应该可以让你开始。