2016-07-15 12 views
0

Ich verwende wsgi-request-logger https://github.com/pklaus/wsgi-request-logger in einem Kolben-Anwendung und müssen es auch die Anfrage Parameter (dh die Argumente, die mit der Anfrage gesendet werden).Drucken Sie oder senden Sie die Anfrage Argumente/Formulardaten

Mit request.form oder request.args nicht funktioniert und kehrt -

Runtime: Arbeiten außerhalb des Anforderungskontext.


val['params'] = url_decode(environ.get('QUERY_STRING', '')) print val['params']

Dies funktioniert nicht und gibt MultiDict ([]) (versuchte es in Middleware und die views.py Datei, gibt es die gleiche Sache für beide Fälle).


if environ['REQUEST_METHOD'] == 'POST': 
    print parse_form_data(environ)[1] 

Das gibt MultiDict [zu].

Ich verstehe nicht, was ich hier vermisse. Hilfe wäre großartig.


Code, der die Middleware aufruft. Ich habe die Middleware ein wenig überarbeitet und den Namen der Datei in request_logger_wsgi geändert, um sie jetzt mit einem lokalen Klon zu testen.

#!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) 

Antwort

0

Sie sollten mehr Code Ihrer Anwendung posten, sonst ist es sehr schwierig zu helfen.

Sie können das Objekt request von Flask nicht in der WSGI-Ebene verwenden. Die wsgi-request-logger läuft vor Flask, deshalb gibt es noch keinen Anfragekontext.

Ihr anderer Code wurde wahrscheinlich in einem Modul ausgeführt und Sie haben os.environ verwendet, was sich von der WSGI-Umgebung unterscheidet.

Was Sie wirklich tun müssen, ist einen benutzerdefinierten Formatierer zu erstellen und sagen

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

Und dann die Formatierungs gesetzt:

app = WSGILogger(application, handlers, query_formatter) 

Es wäre jedoch besser, eine der Apache Formatierer wiederzuverwenden stattdessen:

Dieser Formatierer wird das NCSA-Format verwenden und den q anhängen Sehr gute Saite. Es gibt wahrscheinlich bessere Formate für die Protokollnachricht, aber das sollte Ihnen den Einstieg erleichtern.

+0

Hallo, danke für die Antwort. Ich habe mein OP bearbeitet und mehr Code hinzugefügt. Wenn mehr benötigt wird, werde ich das auch hinzufügen. –

+0

Die Abfragezeichenfolge gibt mir keine Argumente im Falle von POST-Anfragen? –

+0

Es gibt Ihnen keine Formulardaten, nein. Es können jedoch auch Abfragezeichenfolgen für eine POST-Anforderung ** zusätzlich bereitgestellt werden, um Daten zu bilden. Möchten Sie wirklich POST-Anfragen protokollieren? Sie können viele Daten enthalten und Sie müssen sich Sorgen um die Kodierung der Daten machen. Wenn ein Formular "multipart/form-data" verwendet, kann die POST-Anfrage beispielsweise Zeilenumbrüche enthalten. –

Verwandte Themen