生产环境中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中执行更新命令:
也可以直接在Django Admin后台修改Site对象的域名和名称。from django.contrib.sites.models import Site site = Site.objects.get(id=1) site.domain = 'abc.xyz.com' site.name = '你的站点名称' site.save()
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
相关产品推荐
相关产品推荐

