【问题标题】:Flask/PyMongo - Initialize pymongo at the top of the appFlask/PyMongo - 在应用顶部初始化 pymongo
【发布时间】:2015-02-25 08:17:52
【问题描述】:

我正在尝试扩展我的第一个 Flask 应用程序,但不了解在多个模块中使用 pymongo db 所需的结构。例如,这是我的新结构:

run.py
app/
├── __init__.py
├── forms.py
├── static/
├── templates/
└── views/
    ├── __init__.py
    ├── bookmarklet.py
    ├── main.py
    └── user.py

在尝试扩展它之前,我在我的单个 views.py 文件的顶部有这个:

from flask.ext.pymongo import PyMongo
mongo = PyMongo(app)
with app.app_context():
    mongo.db.user.ensure_index("email", unique=True)

目标是能够在所有视图模块以及forms.py 模块中使用这个mongo 实例。我试过这两件事:

  1. 把上面的sn-p放到app/__init__.py文件里,但是好像不能让其他模块可以访问。我试过这样做:app.db = mongo.db(但下游不可用)
  2. 把上面的sn-p放到需要它的每个模块中,但是我得到的错误是有多个mongo实例具有相同的前缀。

这个初始化应该放在哪里才能让它在应用程序的任何地方都可以访问?

编辑

听起来我做得对,但还有其他事情发生。我正在发布我更完整的代码和错误。

app/__init__.py

from flask import Flask

app = Flask(__name__)
from app.views import main

app.config.update(
    DEBUG = True,
    SECRET_KEY = "not telling",
    WTF_CSRF_ENABLED = False,
)

app.jinja_env.add_extension('pyjade.ext.jinja.PyJadeExtension')

from flask.ext.pymongo import PyMongo
mongo = PyMongo(app)
with app.app_context():
    mongo.db.user.ensure_index("email", unique=True)

app/views/main.py

from app import app
from flask import render_template, redirect, request, flash, url_for
from flask.ext.jsonpify import jsonify
from app.forms import *

from app import *
print mongo

错误:

(venv)imac: me$ ./run.py 
Traceback (most recent call last):
  File "./run.py", line 4, in <module>
    from app import app
  File "/Users/me/Dropbox/development/test/app/__init__.py", line 4, in <module>
    from app.views import main
  File "/Users/me/Dropbox/development/test/app/views/main.py", line 9, in <module>
    print mongo
NameError: name 'mongo' is not defined

【问题讨论】:

    标签: python mongodb flask pymongo


    【解决方案1】:

    将该 sn-p 放入 app/__init__.py。例如,如果您想在forms.py 中访问它,请尝试:

    ...
    from app import *
    # then you can use mongo here
    print mongo
    ...
    

    例如,如果您想在user.py 中访问它,请尝试上面的相同代码。

    检查这是否适合您。如果没有,请显示错误消息,我会考虑解决方案二。

    【讨论】:

    • 感谢您再看一眼。我已经在上面发布了代码和错误。
    • 我感觉这和app的用法有关。在文件的开头我必须做from app import app。后来,如果我引用app,它怎么知道使用哪个?我也试过没有from app import *,只是使用print app.mongo无济于事。
    【解决方案2】:

    已解决

    我的__init__.py 文件中的错误是我很早就导入了我的视图。最后你必须这样做!

    错误

    from flask import Flask
    
    app = Flask(__name__)
    from app.views import main # <- TOO EARLY
    
    app.config.update(
        DEBUG = True,
        SECRET_KEY = "not telling",
        WTF_CSRF_ENABLED = False,
    )
    
    app.jinja_env.add_extension('pyjade.ext.jinja.PyJadeExtension')
    
    from flask.ext.pymongo import PyMongo
    mongo = PyMongo(app)
    with app.app_context():
        mongo.db.user.ensure_index("email", unique=True)
    

    正确

    from flask import Flask
    from flask.ext.pymongo import PyMongo
    
    app = Flask(__name__)
    
    mongo = PyMongo(app)
    with app.app_context():
        mongo.db.user.ensure_index("email", unique=True)
    
    app.config.update(
        DEBUG = True,
        SECRET_KEY = "not telling",
        WTF_CSRF_ENABLED = False,
    )
    
    app.jinja_env.add_extension('pyjade.ext.jinja.PyJadeExtension')
    
    # AT THE BOTTOM!
    from app.views import main
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-25
      • 2015-03-30
      • 2016-06-05
      • 2013-05-28
      • 2017-09-07
      • 2017-07-07
      • 2019-12-03
      • 2018-02-27
      相关资源
      最近更新 更多