2016-04-16 3 views
3

Also habe ich diese Methode, die mit einem http.get-Aufruf aufgerufen wird.RuntimeError: Arbeit außerhalb des Anfragekontextes Wenn die Anfrage in der ersten Zeile der Methode verwendet wurde

Ich habe gelesen, dass dieser Fehler mit Multithreading und ähnlich, aber es gibt nichts Kompliziertes hier. Der Fehler wird für die erste Zeile dieser Methode geworfen: ‚spid = request.args [‘ spid ‚]‘

>>> longrunners.get_sql() 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/opt/tools/dba/longrunners/longrunners.py", line 48, in get_sql 
    spid = request.args['spid'] 
File "/usr/local/lib/python2.7/site-packages/werkzeug/local.py", line 343, in __getattr__ 
return getattr(self._get_current_object(), name) 
File "/usr/local/lib/python2.7/site-packages/werkzeug/local.py", line 302, in _get_current_object 
return self.__local() 
File "/usr/local/lib/python2.7/site-packages/flask/globals.py", line 20, in _lookup_req_object 
raise RuntimeError('working outside of request context') 
RuntimeError: working outside of request context 

ich andere Methoden, die erfolgreich das Request-Objekt zugreifen, und überprüft haben, dass ich bin in der Tat einen Parameter aus dem Browser namens "Spid" zu senden.

Irgendwelche Ideen, was könnte das verursachen? Ich habe ein paar andere Fragen durchgesehen und im Internet nachgeschaut, aber nichts gefunden, was mit dieser speziellen Situation zu tun hat.

Danke!

+1

_always_ zeigen Sie Ihre Traceback ... – thebjorn

+0

meine Entschuldigung! hatte es fertig zum kopieren und einfügen und ich habe es total vergessen. Habe es einfach hinzugefügt, Danke! – Jacob

Antwort

2

Ihre get_sql-Funktion ist ein Flask-Route-Callback. Es wird erwartet, dass es sich um einen Anfragekontext handelt. Wenn diese Funktion mit einer HTTP-Anforderung aufgerufen wird, kann auf request zugegriffen werden.

Wenn Sie es aus anderen Kontexten aufrufen möchten, entkoppeln Sie die Anfrage und die anderen Teile Ihrer Funktion.

@app.route('/showSQL') 
def get_sql_callback(): 
    spid = request.args['spid'] 
    instance = request.args['instance'] 
    return get_sql(spid, instance) 


def get_sql(spid, instance): 
    user = creds.creds['bh1']['user'] 
    pw = creds.creds['bh1']['pass'] 

    print 'calling show sql', spid, instance 

    conn = pymssql.connect(instance, user, pw) 
    cursor = conn.cursor(as_dict=True) 

    cmd = 'EXEC master..getSpidSQL ' + str(spid) 

    cursor.execute(cmd) 
    sql_out = None 
    for row in cursor: 
     sql_out = row['EventInfo'] 

    return sql_out 

Jetzt können Sie es von der Shell aus aufrufen oder als HTTP-Anfrage darauf zugreifen.

+0

Ohhhhhh! Ich bin ein Idiot! Ich bekam 500 Fehler, als ich das tatsächlich von der App aus anrief (mit Hilfe einer HTTP-Anfrage) und ging, um es in der Shell zu testen ... Was die Verwendung eines Anfrageobjekts komplett zunichte macht. Ich werde es so implementieren, wie Sie es erwähnt haben, um zu testen, was falsch läuft. Vielen Dank!! – Jacob

Verwandte Themen