Django Загруженные изображения не отображаются в производстве - PullRequest
0 голосов
/ 21 июня 2020

Мне известен этот вопрос: Django Загруженные изображения не отображаются в разработке , Я сделал все, что описано, но все еще не могу найти решение. Я также использовал для справки следующее: GeeksForGeeks и Загруженные файлы и загруженные обработчики - Django документация , однако ни один из них не решил мою проблему.

У меня есть впервые развернул приложение Django на сервере Ubuntu, используя Nginx и gunicorn. Перед развертыванием я использовал порт 8000, чтобы проверить, все ли работает так, как должно, и все ли в порядке. Поскольку я разрешил 'Nginx Full', изображения моей базы данных не отображаются.

Это моя структура проекта django:

project structure

My virtual environment folder and my main project folder are both in the same directory. I have separated them.

# Create your models here.
class Project(models.Model):
    project_name = models.CharField(max_length=120)
    project_description = models.CharField(max_length=400)
    project_link = models.CharField(max_length=500)
    project_image = models.ImageField(upload_to='')

    def __str__(self):
        return self.project_name

Я настроил свой settings.py на:

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

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


MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(__file__), '..', 'media').replace('\\','/')

Мое представление получает все объекты проекта из базы данных и передает их в шаблон. Шаблон успешно отображает всю остальную информацию, относящуюся к модели проекта, за исключением поля изображения. В моем шаблоне я делаю:

 <div class="row text-center mx-auto">

        {% for project in projects %}
        {% if forloop.counter|mod:2 == 0 %}
        <div class="col projects pb-3 pt-3 mb-3 ml-2">
          {% else %}
          <div class="col projects pb-3 pt-3 mb-3 mr-2">
            {% endif %}

            <img class="card-img-top pt-2 pl-2 pr-2" src="{{ project.project_image.url}}"
              alt="Image could not be found :(" style="height:120px; width:166px !important;" /><br>
            <div class="card-body">
              <h3 class="card-title ">{{ project.project_name }}</h3>
              <p class="card-text dates">{{ project.project_description}}</p>
              <a href="{{ project.project_link }}" class="btn btn-dark" target="_blank">Link</a>

            </div>
          </div>

          {% if forloop.counter|mod:2 == 0 %}
          <div class="w-100"></div>
          {% endif %}
          {% endfor%}
        </div>
      </div>

Загрузка изображений работает, они отправляются в медиа-каталог проекта, проблема в том, что они не отображаются, активирован alt = "".

Мой основной urls.py:

urlpatterns = [
     path('', include('project.urls')),
    path('admin/', admin.site.urls),
]  + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Системный файл gunicorn:


[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=myusername
Group=www-data
WorkingDirectory=/home/myusername/myproject
ExecStart=/home/myusername/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/myusername/myproject/myproject.sock myproject.wsgi:application

[Install]
WantedBy=multi-user.target

Nginx настройка:

  server {
        listen 80;
        server_name <my IP> ;
        location = /favicon.ico { access_log off; log_not_found off; }
        location /static/ {
            root /home/myusername/myproject;
        }
        location / {
            include proxy_params;
            proxy_pass http://unix:/home/myusername/myproject/myproject.sock;
        }
    }

РЕДАКТИРОВАТЬ: при проверке элемент изображения веб-страницы, источником изображения является "/media/imageNmae.png". Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ: Решение найдено, Nginx не обслуживает СМИ, как предложил Даниэль. Существует некоторая документация по uWSGI, которую стоит прочитать, чтобы избежать подобных проблем Документация

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Ваш Nginx не обслуживает MEDIA_URL, т.е. /media/. Вам нужен раздел конфигурации Nginx, как для /static/

  server {
        listen 80;
        server_name <my IP> ;
        location = /favicon.ico { access_log off; log_not_found off; }
        location /static/ {
            root /home/myusername/myproject;
        }
        location /media/ {
            root /home/myusername/myproject;
        }
        location / {
            include proxy_params;
            proxy_pass http://unix:/home/myusername/myproject/myproject.sock;
        }
    }
0 голосов
/ 21 июня 2020

Возможно, вам потребуется запустить команду python manage.py collectstatic из оболочки вашей платформы, если вы используете здесь heroku i команду

heroku run python manage.py collectstatic
...