app.py
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("https://stackoverflow.com/")
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()
prueba.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"
estoy importando aplicación en prueba.py para pruebas unitarias. Al llamar ‘before_request‘ función en test.py, está lanzando RuntimeError: trabajando fuera del contexto de la aplicación, lo mismo está sucediendo al llamar ‘input_info()‘
brenns10
El matraz tiene un Contexto de la aplicacióny parece que tendrás que hacer algo como:
def test_connection(self):
with app.app_context():
#test code
Probablemente también puedas empujar el app.app_context()
llamar a un método de configuración de prueba también.
-
@ brenns10, ¿puede contarnos más sobre esto? ¿Por qué pasó esto?
– Aks
15 de enero de 2018 a las 9:30
-
@aks La página vinculada probablemente tenga una mejor explicación de la que podría dar. Básicamente, según el diseño de Flask, (1) el código debería poder acceder a una variable global que contenga el objeto de la aplicación Flask actual, pero (2) pueden existir múltiples aplicaciones en un solo proceso. Flask maneja esto configurando algunas variables antes de manejar una solicitud. Pero cuando está probando, debe configurar el “contexto de la aplicación” usted mismo, para que su código pueda encontrar las variables globales correctas.
– brenns10
16 de enero de 2018 a las 21:26
-
Me sale esto por usar
jsonify
. Es realmente malo que una conversión JSON simple requiera que la aplicación se ejecute “en contexto”.– milosmns
11 de enero de 2020 a las 19:14
-
@milosmns: jsonify es más que una simple conversión de json. En realidad, construye una respuesta http adecuada. Puede usar json.dumps() directamente si desea una conversión json simple. De lo contrario, apuesto a que incluso flask.json.dumps querrá el contexto.
–Eddie Parker
11 de febrero de 2022 a las 23:37
-
@Eddie Parker: Supongo que eso es exactamente lo que no me gustó. Esperaba que la funcionalidad básica (o mejor: predeterminada, bien conocida) se ejecutara sin ningún requisito adicional (como el contexto de la aplicación)… y luego tal vez componer además de eso agregando funcionalidad adicional (como HTTP) a través de alguna opción. API. Tal vez también sea un problema de comunicación/documentación. No sé qué se usa más: conversión JSON simple o JSON + HTTP, por lo que podría estar equivocado al suponer que la mayoría de las personas solo quieren una conversión simple.
– milosmns
13 de febrero de 2022 a las 10:04
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
app.app_context().push()
Run in terminal
>python
>>>from app import app
>>>from app import db
>>>db.create_all()
Now it should work
paddy alton
Seguí la respuesta de @ brenns10 cuando me encontré con un problema similar al usar pytest
.
Seguí la sugerencia de ponerlo en configuración de prueba, esto funciona:
import pytest
from src.app import app
@pytest.fixture
def app_context():
with app.app_context():
yield
def some_test(app_context):
# <test code that needs the app context>
Estoy usando python3.8 y tuve que usar una pequeña variación de las respuestas ya publicadas. Incluí lo siguiente en pytests y no tuve que cambiar nada más en el resto del archivo de prueba.
from flask import Flask
@pytest.fixture(autouse=True)
def app_context():
app = Flask(__name__)
with app.app_context():
yield
Esto también se puede usar con un administrador de contexto. La diferencia principal a tener en cuenta aquí es la creación de la aplicación Flask dentro del archivo de prueba en lugar de importarla desde el archivo de la aplicación principal.