You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker集成FastAPI与Redis遇阻:服务无法访问及Redis集成困惑求助

问题解决步骤

一、修复浏览器无法连接FastAPI服务的问题

  • 你用https访问是错误的,Uvicorn默认只提供http服务,应访问http://localhost:8000
  • 运行Docker容器时必须做端口映射,把容器内的80端口映射到宿主机的8000端口:
    单独运行容器命令:docker run -p 8000:80 你的镜像名称

二、集成Redis服务(用docker-compose管理多容器)

1. 补充依赖库

修改requirements.txt,添加Redis客户端:

fastapi
uvicorn
redis

2. 修正main.py的Redis连接与逻辑

把Redis连接的host从localhost改为redis(对应docker-compose中的服务名),同时替换不安全的eval为JSON序列化:

from fastapi import FastAPI
from redis import StrictRedis
import json

app = FastAPI()

# 连接docker-compose中的Redis服务
redis_data = StrictRedis(host="redis", port=6379, db=0, decode_responses=True)

@app.get("/")
async def get_product_information(product_name: str=""):
    if product_name == "":
        products = {}
        for key in redis_data.scan_iter():
            products[key] = json.loads(redis_data.get(key))
        return products
    product_data = redis_data.get(product_name)
    if product_data:
        return json.loads(product_data)
    return "Error : None of the referenced products has the specified name"

@app.post("/")
async def add_product(product: dict):
    for feature in ("name", "quantity", "price"):
        if feature not in product:
            return f"Error : The product should have a {feature}."
    product_name = product.pop("name")
    redis_data.set(product_name, json.dumps(product))
    return "The product has been added."

@app.delete("/")
async def remove_product(product_name: str):
    if redis_data.exists(product_name):
        redis_data.delete(product_name)
        return "The product has been removed."
    return "Error : None of the referenced products has the specified name."

注:用json.loads/json.dumps替代eval,避免代码注入风险,同时保证数据读写的一致性。

3. 创建docker-compose.yml配置文件

通过docker-compose同时启动FastAPI和Redis,自动创建共享网络:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8000:80"
    depends_on:
      - redis
    command: ["sh", "-c", "sleep 2 && uvicorn main:app --host 0.0.0.0 --port 80"]
  redis:
    image: redis:alpine
    ports:
      - "6379:6379"
    # 可选:持久化Redis数据,防止容器重启丢失
    volumes:
      - redis_data:/data

volumes:
  redis_data:

4. 构建并启动服务

在项目根目录执行命令:

docker-compose up --build

三、验证服务

  • 访问FastAPI接口文档:http://localhost:8000/docs,可直接测试增删查接口
  • 验证Redis数据:用redis-cli连接localhost:6379,查看数据是否与接口操作同步

内容的提问来源于stack exchange,提问作者Lapin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:29:53