无法与Pymongo连接到Meteor

时间:2014-04-25 18:20:06

标签: python mongodb meteor pymongo

我正在尝试通过pymongo连接到Meteor Mongo数据库。这是代码:

def get_mongo_url(site):
  # return "mongodb://client-xxxxx:yyyyy@production-db-c1.meteor.io:27017/site"
  import subprocess
  p = subprocess.Popen(['meteor', 'mongo', '--url', site], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  out, err = p.communicate()
  print out
  return out

from pymongo import MongoClient
client = MongoClient(get_mongo_url("mysite.com"))

错误(print语句产生正确的url)

>> mongodb://client-xxxxx:yyyyy@production-db-c1.meteor.io:27017/site
Traceback (most recent call last):
  File "private/test.py", line 46, in <module>
    client = pymongo.MongoClient(get_mongo_url(METEOR_SITE))
  File "/Library/Python/2.7/site-packages/pymongo/mongo_client.py", line 369, in __init__
    raise ConfigurationError(str(exc))
pymongo.errors.ConfigurationError: command SON([('authenticate', 1), ('user', u'client-xxxxx'), ('nonce', u'zzzzz'), ('key', u'ttttt')]) failed: auth fails

如果我运行meteor mongo --url mysite.com,将结果复制到函数顶部的return ...并取消注释,连接就可以了。为什么我不能以编程方式连接?

1 个答案:

答案 0 :(得分:2)

子流程代码将换行符\n附加到网址的末尾。

您需要使用.rstrip()

删除它

正确的方法是用

替换函数中的返回值

return out.rstrip()

为了确认目的,我将展示函数as-is和 rstrip()已应用/未应用于返回。

  
    
      

murl = get_mongo_url(&#39;&#39;)。rstrip()
      mongodb:// client-faf1d0db:746d8f43-367b-dde2-b69a-039ff8b9f7fa@production-db-a1.meteor.io:27017 / _meteor_com

             

client = pymongo.MongoClient(murl)

    
  

工作正常

  
    
      

murl = get_mongo_url(&#39;&#39;)
      mongodb:// client-3578a20b:d4ddeec9-6d24-713e-8ddb-c357b664948a@production-db-a1.meteor.io:27017 / _meteor_com

             

client = pymongo.MongoClient(murl)
      追溯(最近的呼叫最后):
        文件&#34;&#34;,第1行,在         文件&#34; /home/action/.local/lib/python2.7/site-packages/pymongo/mongo_client.py",第383行, init
          提出ConfigurationError(str(exc))
      pymongo.errors.ConfigurationError:命令SON([(&#39; authenticate&#39;,1),(&#39; user&#39;,u&#39; client-3578a20b&#39;),(&#39; nonce&#39;,u&#39; e14e2bdb3d8484b9&#39;),(&#39; key&#39;,u&#39; 9       c101b78ff1a617a9c5f0def36c7e3d9&#39;)])失败:auth失败

    
  

没有rstrip就失败了。

  
    
      

murl = get_mongo_url(&#39;&#39;)
      mongodb:// client-1a193a61:4c9c572e-22e3-4b7e-44a1-dc76bfb65e86@production-db-a1.meteor.io:27017 / _meteor_com

             

client = pymongo.MongoClient(murl)
      追溯(最近的呼叫最后):
        文件&#34;&#34;,第1行,在         文件&#34; /home/action/.local/lib/python2.7/site-packages/pymongo/mongo_client.py",第383行, init
          提出ConfigurationError(str(exc))
      pymongo.errors.ConfigurationError:命令SON([(&#39; authenticate&#39;,1),(&#39; user&#39;,u&#39; client-1a193a61&#39;),(&#39; nonce&#39;,u&#39; a2576142b1a33d8b&#39;),(&#39; key&#39;,u&#39; 4       419c490bcdcc65b20f2950c3b106d59&#39;)])失败:auth失败

    
  

再次失败(没有rsrtip)

  
    
      

murl = get_mongo_url(&#39;&#39;)。rstrip()
      mongodb:// client-ce463608:d7dc6be0-499f-1808-43e1-fdfb8b6e8ebc@production-db-a1.meteor.io:27017 / _meteor_com

             

client = pymongo.MongoClient(murl)

    
  

工作(使用rstrip)。


以下是有关mongodb网址的一般信息。你可能已经知道了。

pymongo想要的URL不是Web URL,而是mongo数据库连接的类似URL的说明符。 对于开发环境,mongodb通常设置在端口3001上,而端口3001不是生产服务器的默认mongodb端口。

Meteor应用程序可以配置为使用托管在任何地方的mongodb。它不必位于为流星内容提供服务的同一台服务器上。这个规范是通过mongodb:// URL完成的,这是pymongo想要的。 pymongo并不依赖于meteor网站的网址,这可能与mongodb网址截然不同。

以下是我正在使用的一些代码

import pymongo
MONGO_URL = r'mongodb://localhost:3001/meteor'
###
def connect():
  client = pymongo.MongoClient(MONGO_URL)
  return client

def findUser(c, email):
  users = c.meteor.users
  return users.find_one({"emails.address": email})

根据Github上的mongodb网站,MONGO_URL format

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

所以mongodb url mongodb://localhost:3001/meteor可以解释如下:

* mongodb:// means this describes a mongodb connection
* localhost means connect locally 
* :3001 means use non-standard port number 3001.  this is how "meteor run" sets up mongo
* /meteor means connect to the database called "meteor"