簡體   English   中英

燒瓶 Web 服務中的 Mongodb 錯誤 [pymongo.errors.ServerSelectionTimeoutError]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM