【问题标题】:Flask mongoengine connect through uri烧瓶 mongoengine 通过 uri 连接
【发布时间】:2013-03-18 00:19:05
【问题描述】:

我有一个要部署到 Heroku 的小型烧瓶应用程序。

我的本​​地配置如下:

from flask import Flask
from flask.ext.mongoengine import MongoEngine

app = Flask(__name__)
app.debug = True
app.config["MONGODB_SETTINGS"] = {'DB': "my_app"}
app.config["SECRET_KEY"] = "secretpassword"

db = MongoEngine(app)

所以,我知道我需要将应用程序配置为使用 Mongo URI 连接方法,并且我有我的连接信息:

mongodb://<user>:<password>@alex.mongohq.com:10043/app12345678

我对修改我的应用程序以通过URI 连接的语法有点困惑。

【问题讨论】:

    标签: mongodb heroku flask mongoengine


    【解决方案1】:

    所以我得到了它(终于):

    from flask import Flask
    from mongoengine import connect
    
    app = Flask(__name__)
    
    app.config["MONGODB_DB"] = 'app12345678'
    connect(
        'app12345678',
        username='heroku',
        password='a614e68b445d0d9d1c375740781073b4',
        host='mongodb://<user>:<password>@alex.mongohq.com:10043/app12345678',
        port=10043
    )
    

    虽然我预计其他各种配置都可以使用。

    【讨论】:

    • 用户名和密码从何而来?
    • 用户名/密码来自您的 mongohq 帐户:创建一个免费的沙盒帐户,然后在 Databases->Admin->User 中为数据库创建一个用户名/密码。然后在 Databases->Collections 下单击“Connect directly to your database”,然后先尝试 mongo 命令。然后将用户/通行证和应用信息复制到此处发布的解决方案中。
    • 如果您仍然有兴趣让 MongoEngine 包装器类工作,请参阅我对您帖子的回答 :)
    【解决方案2】:

    当你查看flask-mongoengine code时,你可以看到有哪些配置变量可用

    所以这应该有效:

    app.config["MONGODB_HOST"] = 'alex.mongohq.com/app12345678'
    app.config["MONGODB_PORT"] = 10043
    app.config["MONGODB_DATABASE"] = 'dbname'
    app.config["MONGODB_USERNAME"] = 'user'
    app.config["MONGODB_PASSWORD"] = 'password'
    db = MongoEngine(app)
    

    我不确定app123 是应用程序名称还是数据库名称。您可能需要稍微摆弄一下才能获得连接。我在 Heroku 上使用 Mongokit + MongoLab 时遇到了同样的问题 :)

    您也可以像这样使用 URI。

    app.config["MONGODB_SETTINGS"] = {'DB': "my_app", "host":'mongodb://<user>:<password>@alex.mongohq.com:10043/app12345678'}
    

    我实际上不知道“MONGODB_SETTINGS”在什么时候被读取,但是当我在 shell 中尝试它时它似乎有效。

    【讨论】:

    • 我尝试了app.config["MONGODB_SETTINGS"] = {"DB": 'app12345678', "host": 'mongodb://&lt;user&gt;&lt;password&gt;@alex.mongohq.com:10043/app12345678 和各种衍生产品,但仍然没有连接。 heroku 给了我MONGOHQ_URL 变量,所以这应该就是我所需要的吗?
    • 也使用了 URI
    【解决方案3】:

    我想出了如何使用 flask.ext.mongoengine.MongoEngine 包装类而不是 mongoengine.connect() 来做到这一点:

    from flask import Flask
    from flask.ext.mongoengine import MongoEngine
    
    app = Flask(__name__)
    
    HOST = '<hostname>'  # ex: 'oceanic.mongohq.com'
    db_settings = {
        'MONGODB_DB': '<database>',
        'MONGODB_USERNAME': '<username>',
        'MONGODB_PASSWORD': '<password>',
        'MONGODB_PORT': <port>,
    }
    app.config = dict(list(app.config.items()) + list(db_settings.items()))
    app.config["MONGODB_HOST"] = ('mongodb://%(MONGODB_USERNAME)s:%(MONGODB_PASSWORD)s@'+
                                   HOST +':%(MONGODB_PORT)s/%(MONGODB_DB)s') % db_settings
    
    db = MongoEngine(app)
    
    if __name__ == '__main__':
        app.run()
    

    如果您使用的是 mongohq,app.config["MONGODB_HOST"] 应该与 Databases->Admin->Overview 下的 Mongo URI 匹配。

    然后您可以按照 MongoDBtumblelog tutorial 使用此设置编写您的第一个应用程序,名为 tumblelog

    使用 python 的漂亮对象自省(python 哦,我多么你),你可以看到 MongoEngine 包装类是如何完成这个的:

    from flask.ext.mongoengine import MongoEngine
    import inspect
    print(inspect.getsource(MongoEngine))
        ...
        conn_settings = {
            'db': app.config.get('MONGODB_DB', None),
            'username': app.config.get('MONGODB_USERNAME', None),
            'password': app.config.get('MONGODB_PASSWORD', None),
            'host': app.config.get('MONGODB_HOST', None),
            'port': int(app.config.get('MONGODB_PORT', 0)) or None
        }
         ...
         self.connection = mongoengine.connect(**conn_settings)
         ...
         self.app = app
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 2015-04-09
      • 1970-01-01
      • 2019-01-04
      相关资源
      最近更新 更多