折腾:
【已解决】Python中openpyxl处理excel去判断单元格是合并后的以及合并的范围
期间,尝试去优化代码。
参考:
Tutorial — PyMongo 3.6.1 documentation
去尝试把参数设置:
<code>if gUseLocalMongo: # connect to local mongo mongoClient = MongoClient() if gUseRemoteOnlineMongo: # connect to remote mongo mongoClient = MongoClient( host="x.x.x.x", port=27017, username="username", password="P@wd" ) </code>
改为:MongoDB的URL:
<code>mongodbUri = "mongodb://x.x.x.x:27017/" host = "x.x.x.x", port = 27017, username = “username", password = “pass@word" </code>
时发现,此处密码中带有@字符,和:
http://www.runoob.com/mongodb/mongodb-connections.html
中的:
<code>mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]] </code>
格式有冲突啊
mongoDB 的URI中密码包含@字符,如何处理?
mongodb password contain @
node.js – MongoDB password with “@” in it – Stack Overflow
@写成%40,然后加上参数uri_decode_auth: true
但是时js的api
此处时Python的api,去看看是否有这个uri_decode_auth(方面的)参数
另外的人说是,换用参数的写法-》就又变成我之前的写法了。
How do I connect if the password contains an @ sign? · Issue #147 · mrvautin/adminMongo
去PyCharm中看MongoClient的源码,找找关于URI的解释:
看到了:
<code>The `host` parameter can be a full `mongodb URI <http://dochub.mongodb.org/core/connections>`_, in addition to a simple hostname. It can also be a list of hostnames or URIs. Any port specified in the host string(s) will override the `port` parameter. If multiple mongodb URIs containing database or auth information are passed, the last database, username, and password present will be used. For username and passwords reserved characters like ':', '/', '+' and '@' must be percent encoded following RFC 2396 </code>
中的:
For username and
passwords reserved characters like ‘:’, ‘/’, ‘+’ and ‘@’ must be
percent encoded following RFC 2396
说的就是:
用户名和密码,如果其中有特殊字符:
:
/
+
@
必须去编码才行
而具体写法,可以自己去找对于特殊字符的%xx的写法,也可以参考:
<code> uri = "mongodb://%s:%s@%s" % ( quote_plus(user), quote_plus(password), host) client = MongoClient(uri) Unix domain sockets are also supported. The socket path must be percent encoded in the URI:: uri = "mongodb://%s:%s@%s" % ( quote_plus(user), quote_plus(password), quote_plus(socket_path)) client = MongoClient(uri) </code>
所以可以去试试了:
<code>mongodbUri = "mongodb://%s:%s@%s" % (quote_plus("username"), quote_plus("P@wd"), quote_plus("x.x.x.x:27017")) mongoClient = MongoClient(mongodbUri) logging.info("mongoClient=%s", mongoClient) </code>
是可以正常连接的:
【总结】
此处Python中处理MongoDB的话,用的driver是pymongo,其中对于:
MongoClient的话,传入的URI的话,密码中如果包含@等特殊字符的话,(用户名的处理方式也是类似的),则需要encode编码后,再传入:
<code>from urllib import quote_plus # mongodbUri = "mongodb://localhost:27017/" </code>
mongodbUri = “mongodb://%s:%s@%s” % (quote_plus(“username“), quote_plus(“xxx@yyy”), quote_plus(“x.x.x.x:27017”))
# ‘mongodb://username:xxx%40yyy@x.x.x.x%3A27017′
mongoClient = MongoClient(mongodbUri)
即可正常连接MongoDB了。
【后记】
后来发现:
对于host和port中的冒号,不应该用quote_plus去encode
加上要访问的数据库,更复杂的写法,举例:
<code>MongoHost = "x.x.x.x" </code>
MongoPort = 27017
# with auth
MongoUsername = “gridfs”
MongoPassword = “P@wd”
MongoAuthenticationDatabase = “gridfs”
mongodbUri = “mongodb://%s:%s@%s:%s/%s” % (
quote_plus(MongoUsername), \
quote_plus(MongoPassword), \
MongoHost, \
MongoPort, \
MongoAuthenticationDatabase \
)
#’mongodb://gridfs:P%40wd@x.x.x.x:27017/gridfs’
转载请注明:在路上 » 【已解决】MongoDB的用户的密码中包含@如何写URI