我正在尝试使用flask-restful和mongodb来设置一个宁静的api。 我首先尝试从我的烧瓶应用程序导入mongo并直接使用mongo,但它出现了这样的错误:
RuntimeError: working outside of application context
然后我搜索并发现该数据库应该用在app context。
中所以我在使用mongo的地方添加了上下文,下面是我的目录和代码:
├── app
│ ├── __init__.py
│ └── resource
│ ├── api.py
│ ├── __init__.py
├── runserver.py
├── settings.py
app/__init__.py
:
from flask import Flask
from flask.ext.pymongo import PyMongo
app = Flask('myapp')
# ext pymongo
mongo = PyMongo(app)
from app.resource import api
api.init_app(app)
resource/api.py
:
from app import app, mongo
class Comment(Resource):
parser = reqparse.RequestParser()
parser.add_argument('comment', type=str)
parser.add_argument('community', type=str)
def get(self, id):
# add context
with app.app_context():
res = mongo.db.comment.find_one({'_id': ObjectId(id)})
if res:
res = jsonify(
comment=res['comment'],
community=res['community'])
return res
此代码工作正常。但每次使用mongo时我都必须用app.app_context():
写一下,有没有办法使用mongo并避免写app.app_context()
?
答案 0 :(得分:0)
question you linked中缺少的部分是:
...已经处理了应用程序上下文的管理 当应用程序处理请求时烧瓶,但自从 在视图中不运行create_all()方法,Flask没有设置 你的背景。
我要修改这个答案,希望能让它更清晰。
当您的代码尚未分配应用程序上下文时(例如,当您尝试直接从脚本运行代码时),您只需要使用with app.app_context()
代码。在您提供的resource/api.py
代码示例中,您的get
方法已在设置了应用上下文的情况下进行调用。它是在Flask开始处理请求时设置的,并且仍将被设置为Flask将控制权交给Flask-RESTful,因此当Flask-RESTful将控制权交给您的get
方法时仍然可以设置。 / p>
因此,在这种情况下,您不应该使用app.app_context()
。