Django API未返回URL中带有端口的URL,因此链接断开。如何包含端口?

时间:2019-05-05 11:05:19

标签: django docker nginx django-rest-framework docker-compose

[已解决]这是重复的。请参阅this question

通过runserver命令启动时,我有一个正在开发的基本Django API。我正在返回对象列表,包括媒体文件夹中图像的URL。在开发中,此图像URL包含端口,如下所示。当我在浏览器中单击该链接时,该链接可以正常工作。

"image_url": "http://0.0.0.0:1337/mediafiles/publisher/sample-image4.jpg",

在生产环境(gunicorn,nginx,docker)中,除API返回的URL不包含端口外,其他所有功能均相同,因此链接断开。我该如何确保甚至在生产中也包含该端口?

"image_url": "http://0.0.0.0/mediafiles/publisher/sample-image4.jpg",

我猜这可能是一个Nginx配置问题,因为它可以在开发服务器中使用,但是我真的不知道问题出在哪里,因此我的搜索并没有真正的帮助。我对nginx,django和docker还是很陌生。

settings.py

...
STATIC_URL = '/staticfiles/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

MEDIA_URL = '/mediafiles/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'mediafiles')
...

docker-compose.yml

version: '3.7'

services:
  web:
    build: ./app
    command: gunicorn hello_django.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - ./app/:/usr/src/app/
      - static_volume:/usr/src/app/staticfiles
      - media_volume:/usr/src/app/mediafiles
    ports:
      - "8000"
    env_file: ./app/.env
    environment:
      - DB_ENGINE=django.db.backends.postgresql
      - DB_USER
      - DB_PASSWORD
      - DB_HOST=db
      - DB_PORT=5432
      - DATABASE=postgres
    depends_on:
      - db
    networks:
      - backend

  nginx:
    build: ./nginx
    volumes:
      - static_volume:/usr/src/app/staticfiles
      - media_volume:/usr/src/app/mediafiles
    ports:
      - "1337:80"
    depends_on:
      - web
    networks:
      - backend

networks:
  backend:
    driver: bridge

volumes:
  postgres_data:
  static_volume:
  media_volume:

nginx.conf

upstream hello_django {
    server web:8000;
}

server {

    listen 80;

    location / {
        proxy_pass http://hello_django;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /staticfiles/ {
        alias /usr/src/app/staticfiles/;
    }

    location /mediafiles/ {
        alias /usr/src/app/mediafiles/;
    }

    location /favicon.ico {
        access_log off;
        log_not_found off;
    }
}

0 个答案:

没有答案