![](/img/trans.png)
[英]pymongo.errors.ServerSelectionTimeoutError error with MongoDB atlas and Flask
[英]Mongodb error [pymongo.errors.ServerSelectionTimeoutError] in flask web-service
所以我做了一個連接到 mongodb 的燒瓶網絡服務,網絡服務將在一個 docker 容器中,而 mongodb 將在另一個容器中。 當我在我的計算機上本地運行 Web 服務時,它連接到 mongodb 容器並且一切正常。 如前所述,當我將它們放在 2 個單獨的容器中時,我可以很好地使用 GET 方法,但 POST 方法從不工作,每次我嘗試在數據庫中進行更改或插入一些東西時,程序都會凍結幾秒鍾然后我得到錯誤的超時錯誤圖像。 有問題的 Web 服務的端點之一是這個(我還將添加文件的開頭,以便您可以看到與 db 的連接):
from flask import Flask, request, Response, jsonify
import json
from pymongo import MongoClient
from datetime import date
client = MongoClient("mongodb://localhost:27017")
db=client["DigitalNotes"]
users=db["Users"]
admins=db["Admins"]
notes=db["Notes"]
app=Flask(__name__)
@app.route("/sign_up",methods=["POST"])
def sign_up():
try:
data=json.loads(request.data)
except Exception as e:
return Response("Bad json content",status=500,mimetype='application/json')
if data==None:
return Response("Bad request",status=500,mimetype='application/json')
if not "email" in data or not "username" in data or not "name" in data or not "password" in data:
return Response("Information incompleted",status=500,mimetype='application/json')
if users.count_documents({"email":data["email"]})==0 or users.count_documents({"username":data["username"]})==0:
user = {"email":data["email"],"username":data["username"],"name":data["name"],"password":data["password"]}
users.insert_one(user)
return Response(data["username"]+" was added to the DataBase",status=200,mimetype='application/json')
else:
return Response("A user with the given username or password already exists",status=200,mimetype='application/json')
創建容器的 Dockerfile 是這樣的:
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y python3 python3-pip
RUN pip3 install flask pymongo
RUN pip3 install datetime
RUN mkdir /app
COPY app.py /app/app.py
EXPOSE 5000
WORKDIR /app
ENTRYPOINT ["python3","-u","app.py"]
mongodb 的容器是在一個 docker-compose 文件中創建的,它是這樣的:
version: '2'
services:
mongodb:
image: mongo
restart: always
container_name: mongodb
ports:
- 27017:27027
volumes:
- ./mongodb/data:/data/db
flask-service:
build:
context: ./flask-service
restart: always
container_name: flask
depends_on:
- mongodb
ports:
- 5000:5000
environment:
- "MONGO_HOSTNAME=mongodb"
我只是不明白為什么它在本地運行良好而不是在容器中運行良好。 有人可以幫忙嗎??
Flask 容器中 MongoDb 的連接字符串應該是mongodb://mongodb:27017
因為在容器之間你應該指定服務名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.