pymongo 연결에서 암호로 @를 탈출하는 방법은 무엇입니까?
제 질문은 제가 어떻게 pymongo를 통해 mongodb 인증을 위한 사용자 이름 비밀번호를 검증할 수 있는지에 대한 명세입니다.
MongoDB Docs에서 설명한 대로 PyMongo 3.2.2와 사용자와 비밀번호가 포함된 URL을 사용하여 MongoDB 인스턴스에 연결하려고 합니다.다른 점은 제가 사용하고 있는 비밀번호에 '@'가 포함되어 있다는 것입니다.
처음에는 탈출하지 않고 간단하게 연결하려고 했습니다.
접두사 = 'mongodb://'
사용자 = '사용자:passw_with_@_'
접미사 = '@127.0.0.1:27001/'
conn = 피몽고.MongoClient(접두사 + 사용자 + 접미사)
당연히 다음과 같은 오류가 발생했습니다.
InvalidURI: ':' or '@' characters in a username or password must be escaped according to RFC 2396.
그래서 urllib를 사용하여 user:pass part를 탈출하려고 했습니다.인용문은 다음과 같습니다.
접두사 = 'mongodb://'
사용자 = urllib.인용문("사용자:passw_with_@_")
접미사 = '@127.0.0.1:27001/'
conn = 피몽고.MongoClient(접두사 + 사용자 + 접미사)
하지만 전 다음과 같은 걸 받았어요.
OperationFailure: Authentication failed.
(GUI MongoDB Management Tool(Robomongo, 문제가 되는 경우)을 사용하여 (실제) 주소와 자격 증명을 사용하여 MongoDB에 연결할 수 있습니다.)
위의 코드에서 사용자 변수를 인쇄하는 중에 다음이 생성되었습니다.'user:passw_with_%40_'
문자열(즉 '@'이 '%40'이 됨)과 위키피디아에 따르면 탈출이 예상됩니다.
저는 싱글 백슬래시와 더블 백슬래시로 @를 탈출하기도 했습니다.user = 'user:passw_with_\\@_'
그리고.user = 'user:passw_with_\@_'
), 그러나 잘못된 것으로 실패한 것들.URI 예외입니다.
TL;DR;
제 질문은:MongoDB URL의 암호 부분에서 '@'를 이스케이프하려면 어떻게 해야 합니까?
다음을 사용하여 암호를 벗어날 수 있습니다.urllib.quote()
암호를 따옴표로 묶거나 이스케이프해야 하지만,username:
그렇지 않으면:
로도 탈출할 것입니다.%3A
.
예:
import pymongo
import urllib
mongo_uri = "mongodb://username:" + urllib.parse.quote("p@ssword") + "@127.0.0.1:27001/"
client = pymongo.MongoClient(mongo_uri)
위의 스니펫은 MongoDB v3.2.x 및 PyMongo v3.2.2에 대해 테스트되었습니다.
위의 예는 MongoDB URI 연결 문자열에서 가정되었습니다.
- 사용자는 에서 생성됩니다.
admin
데이터베이스 - 호스트
mongod
에서 실행 중: 127.0.0.1(localhost) - 항구
mongod
에 할당된 값은 27001입니다.
mlab 인스턴스에 연결하기 위한 Python 3.6.5 - PyMongo 3.7.0 버전:
from pymongo import MongoClient
import urllib.parse
username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus('password')
client = MongoClient('mongodb://%s:%s@ds00000.mlab.com:000000/recipe_app_testing' % (username, password))
이것이 플라스크-피몽고 스핀업 앱을 사용하지 않고 mlab MongoDB 인스턴스에 연결할 수 있는 유일한 방법입니다. 유닛 테스트를 위한 고정 장치를 만들어야 했습니다.
Python 3.6.5 - PyMongo 3.7.0 localhost 버전:
from pymongo import MongoClient
import urllib.parse
username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus('password')
client = MongoClient('mongodb://%s:%s@127.0.0.1:27001/' % (username, password))
터미널에서 실행:
python -m pip install pymongo[srv]
python 파일:
import pymongo
from pymongo import MongoClient
import urllib.parse
username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus("password")
url = "mongodb+srv://{}:{}@cluster0-0000.mongodb.net/<dbname>?retryWrites=true&w=majority".format(username, password)
# url is just an example (your url will be different)
cluster = MongoClient(url)
db = cluster['Sample']
collection = db['temporary']
MongoDB 암호에 '@'가 있고 URI와 연결하려면 다음을 사용하여 암호를 바꾸기만 하면 됩니다.
%40
단순한 정보:
MongoDB, Pymongo 및 Mongo 엔진은 암호에 있는 여러 기호를 처리할 수 없습니다.
Windows용 데이터베이스 이름 제한
/\. "$*<>:|?
Unix 및 Linux 시스템의 데이터베이스 이름 제한
/\. "$
이스케이프는 잘못된 기호를 포함할 때 작동하지 않습니다.
언급URL : https://stackoverflow.com/questions/39237813/how-to-escape-in-a-password-in-pymongo-connection
'programing' 카테고리의 다른 글
after_create와 after_save의 차이점은 무엇이며 어떤 것을 사용해야 합니까? (0) | 2023.06.21 |
---|---|
SQL Server 쿼리: 리터럴에서는 빠르지만 변수에서는 느림 (0) | 2023.06.21 |
Python에서 빈 문자열을 분할할 때 split()는 빈 목록을 반환하는 반면 split('\n')는 ['?'를 반환하는 이유는 무엇입니까? (0) | 2023.06.21 |
ASP.NET Identity 2.0에서 현재 사용자 ID 가져오기 (0) | 2023.06.21 |
두 컬렉션의 mongo diff 비교 (0) | 2023.06.21 |