2016-07-15 4 views
0

요청 인수/폼 데이터를 반환합니다. 작동하지 않는으로 Request.Form 또는 request.args를 사용인쇄 또는 내가 플라스크 응용 프로그램에서 WSGI 요청 로거 <a href="https://github.com/pklaus/wsgi-request-logger" rel="nofollow">https://github.com/pklaus/wsgi-request-logger</a>을 사용하고 또한 요청 매개 변수 (예. 요청과 함께 전송되는 인수)를 기록하는 데 필요하고

반환 -

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 층에서 플라스크의 request 개체를 사용할 수 없습니다. wsgi-request-logger은 Flask보다 먼저 실행되기 때문에 아직 요청 컨텍스트가 없습니다.

당신은 다른 코드는 아마 모듈에서 실행 된 당신은 WSGI 환경에서 다른 os.environ을 사용했다.

app = WSGILogger(application, handlers, query_formatter) 

그러나 아파치 포맷터 중 하나를 다시 사용하는 것이 좋습니다 것입니다 : 당신이 실제로 무엇을해야

사용자 정의 포매터를 만들고

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 uery 문자열. 아마도 로그 메시지의 형식이 더 좋을 수도 있지만, 시작해야합니다.

+0

안녕, 회신 주셔서 감사합니다. OP를 편집하고 더 많은 코드를 추가했습니다. 더 이상 필요하다면 추가 할 것입니다. –

+0

POST 요청의 경우 쿼리 문자열이 나에게 인수를주지 않습니다? –

+0

양식 데이터를 제공하지 않습니다. 그러나 쿼리 문자열은 POST 요청 **에 추가로 ** 제공되어 데이터를 형성 할 수 있습니다. 정말로 POST 요청을 기록 하시겠습니까? 그들은 많은 양의 데이터를 포함 할 수 있으며 데이터의 인코딩에 대해 걱정해야합니다. 폼이'multipart/form-data'를 사용한다면, 예를 들어 POST 요청은 개행을 포함 할 수 있습니다. –