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

生产环境中Django REST分页URL显示localhost而非域名的问题求助

解决Django REST分页URL显示localhost而非生产域名的问题

核心原因

你当前使用的runserver是Django开发服务器,无法正确处理生产环境中反向代理传递的请求头,导致生成的分页URL使用了容器内部的localhost:8000而非实际域名。同时,Django配置中缺少对生产域名和代理头的正确设置。

解决步骤

1. 替换开发服务器为生产级WSGI服务器

生产环境禁止使用runserver,改用Gunicorn这类生产服务器:

  • 在requirements.txt中添加Gunicorn依赖:
    gunicorn>=20.1.0
    
  • 修改Dockerfile的启动命令:
    # 替换原CMD命令
    CMD ["gunicorn", "your_project_name.wsgi:application", "--bind", "0.0.0.0:8000"]
    
    注意将your_project_name替换为你实际的Django项目名称(即包含wsgi.py的目录名)。

2. 调整Django配置文件(settings.py)

添加或修改以下配置项:

# 允许生产域名和容器内部访问
ALLOWED_HOSTS = ['abc.xyz.com', '0.0.0.0']

# 开启代理头支持,让Django识别反向代理传递的HTTPS和Host信息
USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# 指定站点ID(需确保数据库中Site记录的域名正确)
SITE_ID = 1

3. 更新Django Site模型记录

Django的Site模型用于生成正确的站点URL,需将其域名改为生产域名:

  • 进入Django容器执行shell:
    docker exec -it your_container_name python manage.py shell
    
  • 在shell中执行更新命令:
    from django.contrib.sites.models import Site
    site = Site.objects.get(id=1)
    site.domain = 'abc.xyz.com'
    site.name = '你的站点名称'
    site.save()
    
    也可以直接在Django Admin后台修改Site对象的域名和名称。

4. 配置反向代理(以Nginx为例)

如果使用Nginx作为反向代理,确保配置中传递正确的请求头给Django容器:

server {
    listen 443 ssl;
    server_name abc.xyz.com;

    # SSL证书配置(根据实际情况添加,此处省略)

    location / {
        proxy_pass http://django_container:8000; # 替换为你的Django容器名称或IP
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

验证

重新构建Docker镜像并启动容器后,调用列表API,分页的next/previous URL应该会显示为https://abc.xyz.com/api/transaction/?...的正确格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:23:55