【问题标题】:what is the right way to initializa a database with flask_pymongo?用 flask_pymongo 初始化数据库的正确方法是什么?
【发布时间】:2023-03-12 01:07:01
【问题描述】:

我正在尝试编写一个愚蠢的应用程序,以便我可以练习 docker(我正在尝试学习 Docker)。因此,我使用 Mongo 编写了一个简单的烧瓶应用程序,但是当我尝试启动时,我收到如下错误:

Traceback (most recent call last):
  File "C:\Users\anton\Desktop\cars\app.py", line 16, in <module>
    app.config["MONGO_URI"] = 'mongodb://' + os.environ['MONGODB_USERNAME'] + ':' + os.environ['MONGODB_PASSWORD'] + '@' + os.environ['MONGODB_HOSTNAME'] + ':27017/' + os.environ['MONGODB_DATABASE']
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.496.0_x64__qbz5n2kfra8p0\lib\os.py", line 679, in __getitem__
    raise KeyError(key) from None
KeyError: 'MONGODB_USERNAME'

我一直在这里搜索文档和几个不同的线程,并尝试使用其他一些方法来定义有效的 app.config,但我需要它是这样的,所以我可以将它添加到 @我的 docker-compose 中的 987654322@ 字段。这是app.py:

from flask import Flask, jsonify
from flask_pymongo import PyMongo
import os
import json_logging, logging, sys

app = Flask(__name__)

json_logging.init_flask(enable_json=True)
json_logging.init_request_instrument(app)
logger = logging.getLogger("mongodb-service")
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler(sys.stdout))

app.config["MONGO_URI"] = 'mongodb://' + os.environ['MONGODB_USERNAME'] + ':' + os.environ['MONGODB_PASSWORD'] + '@' + os.environ['MONGODB_HOSTNAME'] + ':27017/' + os.environ['MONGODB_DATABASE']
mongo = PyMongo(app)
db = mongo.db

@app.route('/')
def ping_server():
    return "Welcome to best website ever"

@app.route('/cars')
def get_stored_cars():
    # db = get_db()
    _cars = db.car_tb.find()
    cars = [{"brand": car["brand"], "model": car["model"]} for car in _cars]
    return jsonify({"cars": cars})

我想像这样将它传递给我的 docker.compose.yml:

version: "3.7"
services:
  app:
    container_name: cars_app
    image: latalavera/flask-app:1.4
    build: .
    environment:
      APP_ENV: "dev"
      APP_DEBUG: "False"
      MONGODB_DATABASE: cars_db
      MONGODB_USERNAME: root
      MONGODB_PASSWORD: pass
      MONGODB_HOSTNAME: mongodb-flask
    ports:
      - ${APP_PORT}:${APP_PORT}
    depends_on:
      - mongodb
    networks:
      - app_network 

【问题讨论】:

  • Os.environ 返回环境变量 - 在 Windows 中使用 set 命令初始化。似乎您的变量没有设置 - 或者您是否在其他地方这样做了?
  • 我在学习 Docker 时可能会感到困惑,但我认为 docker compose 中归档的环境将为容器创建那些环境变量。有错吗?

标签: python docker flask docker-compose pymongo


【解决方案1】:

您的 docker compose 中有一个 build 和一个 image 行。您可能想要其中之一;您要么从 dockerfile 构建,要么使用已构建的映像。

【讨论】:

  • 两者都设置是有意义的;它为构建的图像提供了一个特定的名称。 (如果 Compose image: 与 Dockerfile FROM 行相同,这是一个潜在的问题。)
  • @Belly Buster 我不明白你的意思我使用图像字段为我从 dockerfile 构建的图像提供名称。我已按照文档进行操作。据我所知,这是正确的。我的问题是无法将设置应用程序所需的 os.environ 变量传递给容器
  • 好吧,但你没有发布你的 dockerfile,所以不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
相关资源
最近更新 更多