使用mongo时如何避免使用app.context_app

时间:2014-05-08 08:57:27

标签: python mongodb flask

我正在尝试使用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()

1 个答案:

答案 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()