Để hiểu lỗi này, bạn cần hiểu ngữ cảnh ứng dụng .
Ai đó hoàn toàn có thể viết nhiều ứng dụng Flask mà tất cả đều xử lý các yêu cầu của họ trong cùng một quy trình. Tài liệu đưa ra ví dụ sau ...
from werkzeug.wsgi import DispatcherMiddleware
from frontend_app import application as frontend
from backend_app import application as backend
application = DispatcherMiddleware(frontend, {
'/backend': backend
})
Hãy nhớ rằng trong trường hợp này, ứng dụng giao diện người dùng có thể sử dụng các thiết lập Mongo khác nhau, nhưng sử dụng cùng một đối tượng mở rộng Mongo. Vì lý do này, Flask không thể giả định đó là ứng dụng "hiện tại" khi bạn chạy một tập lệnh. Do đó, những thứ như url_for()
hoặc nhiều phương pháp trên tiện ích mở rộng như tiện ích mở rộng MongoDB, cần biết ứng dụng nào là ứng dụng "hiện tại" trước khi chúng thực hiện bất kỳ điều gì.
Do đó, bất cứ khi nào bạn đang cố gắng sử dụng Flask hoặc các chức năng mở rộng để làm bất cứ điều gì khác ngoài việc thiết lập các ứng dụng (với các giá trị cấu hình, v.v.), bạn cần phải nói rõ ràng cho Flask biết ứng dụng hiện tại để gán cho ngữ cảnh ứng dụng .
Tài liệu cung cấp một cách mà bạn có thể thực hiện việc này ..
# Be careful about recursive imports here
from . import app
from .extention import mongo
@sched.interval_schedule(minutes=1)
def long_running_queries():
with app.app_context():
mongo.db.command("aggregate", "collection", pipeline = "some query" )
Vì vậy, bạn sẽ cần tạo chính đối tượng ứng dụng, sau đó sử dụng with app.app_context()
hàng. Trong đó với câu lệnh, tất cả các cuộc gọi của bạn (chẳng hạn như các cuộc gọi đến tiện ích mở rộng Mongo của bạn) sẽ hoạt động. Lưu ý rằng bạn không cần thực hiện bất kỳ thao tác này trong một chế độ xem vì Flask sẽ tự động thực hiện tất cả những việc này như một phần của quá trình xử lý yêu cầu.