2015-07-16 18 views
17

app.pyRuntimeError: ngoài làm việc của bối cảnh ứng dụng

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" 

tôi nhập khẩu ứng dụng vào test.py cho đơn vị gọi điện thoại testing.On Chức năng 'before_request' vào test.py, nó đang chạy RuntimeError: làm việc bên ngoài ngữ cảnh ứng dụng cùng đang xảy ra trên gọi 'input_info()'

Trả lời

37

Flask có Application Context, và nó có vẻ như bạn sẽ cần phải làm một cái gì đó như:

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

Bạn có thể có lẽ cũng xô các app.app_context() cuộc gọi vào một phương pháp thiết lập thử nghiệm là tốt. Hi vọng điêu nay co ich.

+0

cảm ơn @ brenns10 nó đã hoạt động – guri

+0

@ brenns10 bạn có thể vui lòng cho biết thêm về điều này không? Lý do tại sao điều này xảy ra? – aks

+1

@aks Trang được liên kết có thể có giải thích tốt hơn tôi có thể đưa ra. Về cơ bản, cách Flask được thiết kế, (1) mã sẽ có thể truy cập một biến toàn cục chứa đối tượng ứng dụng Flask hiện tại, nhưng (2) nhiều ứng dụng có thể tồn tại trong một tiến trình đơn lẻ. Flask quản lý điều này bằng cách thiết lập một số biến trước khi bạn xử lý một yêu cầu. Nhưng khi bạn đang thử nghiệm, bạn phải tự thiết lập "bối cảnh ứng dụng" để mã của bạn có thể tìm thấy các biến toàn cầu chính xác. – brenns10

Các vấn đề liên quan