【问题标题】:Print or return the request arguments/form data打印或返回请求参数/表单数据
【发布时间】:2016-11-18 05:14:03
【问题描述】:

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

【问题讨论】:

    标签: python python-2.7 logging flask werkzeug


    【解决方案1】:

    您应该发布更多应用程序的代码,否则很难提供帮助。

    你不能在 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 格式并附加查询字符串。日志消息可能有更好的格式,但这应该可以帮助您入门。

    【讨论】:

    • 您好,感谢您的回复。我编辑了我的 OP 并添加了更多代码。如果需要更多,我也会添加。
    • 在 POST 请求的情况下,查询字符串不会给我参数吗?
    • 它不会给你表单数据,不。但是查询字符串也可以提供给 POST 请求另外以形成数据。您真的要记录 POST 请求吗?它们可能包含大量数据,您必须担心数据的编码。例如,如果表单使用multipart/form-data,则 POST 请求可以包含换行符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2022-07-06
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多