2015-07-16 15 views
17

app.pyRuntimeError: al di fuori di lavoro del contesto applicativo

from flask import Flask, render_template, request,jsonify,json,g 
import mysql.connector 

app = Flask(__name__) 
**class TestMySQL():** 
    @app.before_request 
    def before_request(): 
    try: 
     g.db = mysql.connector.connect(user='root', password='root', database='mysql') 
    except mysql.connector.errors.Error as err: 
     resp = jsonify({'status': 500, 'error': "Error:{}".format(err)}) 
     resp.status_code = 500 
     return resp 
@app.route('/') 
def input_info(self): 
    try:  
     cursor = g.db.cursor() 
     cursor.execute ('CREATE TABLE IF NOT EXISTS testmysql (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(40) NOT NULL, \ 
       email VARCHAR(40) NOT NULL UNIQUE)') 
     cursor.close() 

test.py

from app import * 
class Test(unittest.TestCase):   
def test_connection1(self): 
    with patch('__main__.mysql.connector.connect') as mock_mysql_connector_connect: 
    object=TestMySQL() 
    object.before_request() """Runtime error on calling this" 

Sto importando app in test.py per l'unità testing.On chiamata Funzione 'before_request' in test.py, sta generando RuntimeError: funziona al di fuori del contesto dell'applicazione stesso sta accadendo a chiamare 'input_info()'

risposta

37

Flask ha un Application Context, e sembra che avrete bisogno di fare qualcosa di simile:

def test_connection(self): 
    with app.app_context(): 
     #test code 

Probabilmente si può anche spingere la chiamata app.app_context() anche in un metodo di test. Spero che questo ti aiuti.

+0

grazie @ brenns10 ha funzionato – guri

+0

@ brenns10 puoi dirci di più su questo? Perché succede? – aks

+1

@aks La pagina collegata probabilmente ha una spiegazione migliore di quella che potrei dare. Fondamentalmente, il modo in cui Flask è progettato, (1) il codice dovrebbe essere in grado di accedere a una variabile globale contenente l'oggetto dell'app Flask corrente, ma (2) potrebbero esistere più applicazioni in un singolo processo. Flask gestisce questo impostando alcune variabili prima di gestire una richiesta. Ma quando stai provando, devi impostare tu stesso il "contesto dell'applicazione", in modo che il tuo codice possa trovare le variabili globali corrette. – brenns10