我正在尝试通过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 ...
并取消注释,连接就可以了。为什么我不能以编程方式连接?
答案 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_comclient = pymongo.MongoClient(murl)
工作正常
murl = get_mongo_url(&#39;&#39;)
mongodb:// client-3578a20b:d4ddeec9-6d24-713e-8ddb-c357b664948a@production-db-a1.meteor.io:27017 / _meteor_comclient = 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_comclient = 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_comclient = 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"