2015-07-16 7 views
17

app.pyRuntime: Arbeiten außerhalb des Anwendungskontext

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" 

I App in test.py für Einheit testing.On Berufung am Import 'before_request' Funktion in test.py, es wirft RuntimeError: außerhalb des Anwendungskontexts arbeiten gleiche geschieht auf ‚input_info()

Antwort

37

Flask ein Application Context Aufruf hat, und es scheint, wie Sie, wie etwas zu tun brauchen:

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

Sie können den app.app_context() Anruf wahrscheinlich auch Schub in eine Test-Setup-Methode. Hoffe das hilft.

+0

danke @ brenns10 es hat funktioniert – guri

+0

@ brenns10 kannst du bitte mehr darüber erzählen? Warum passiert das? – aks

+1

@aks Die verlinkte Seite hat wahrscheinlich eine bessere Erklärung, als ich geben könnte. Grundsätzlich, wie Flask entworfen ist, sollte Code auf eine globale Variable zugreifen können, die das aktuelle Flask-App-Objekt enthält, aber (2) mehrere Anwendungen könnten in einem einzigen Prozess existieren. Flask verwaltet dies, indem er einige Variablen vor der Bearbeitung einer Anfrage einrichtet. Wenn Sie jedoch testen, müssen Sie den "Anwendungskontext" selbst einrichten, damit Ihr Code die richtigen globalen Variablen finden kann. – brenns10