Django 上传的图片未在生产中显示
Django Uploaded images not displayed in production
我知道这个问题:Django Uploaded images not displayed in development , I have done everything that it is described, but still can't find a solution. I also have used for reference this: GeeksForGeeks and Uploaded Files and Uploaded Handlers - Django documentation,但是,none 解决了我的问题。
我第一次使用 Nginx 和 gunicorn 在 Ubuntu 服务器上部署了 Django 应用程序。
在部署之前,我使用端口 8000 来测试是否一切都按预期运行并且一切正常。由于我允许 'Nginx Full' 我的数据库图像没有显示。
这是我的 django 项目结构:
我的虚拟环境文件夹和我的主项目文件夹都在同一个目录中。我把他们分开了。
# 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 文档值得阅读以避免进一步的类似问题 Documentation
您可能需要运行此命令:
python manage.py collectstatic
来自您平台的 shell
如果你使用的是 heroku,这里是命令
heroku run python manage.py collectstatic
您的 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;
}
}
我知道这个问题:Django Uploaded images not displayed in development , I have done everything that it is described, but still can't find a solution. I also have used for reference this: GeeksForGeeks and Uploaded Files and Uploaded Handlers - Django documentation,但是,none 解决了我的问题。
我第一次使用 Nginx 和 gunicorn 在 Ubuntu 服务器上部署了 Django 应用程序。 在部署之前,我使用端口 8000 来测试是否一切都按预期运行并且一切正常。由于我允许 'Nginx Full' 我的数据库图像没有显示。
这是我的 django 项目结构:
我的虚拟环境文件夹和我的主项目文件夹都在同一个目录中。我把他们分开了。
# 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 文档值得阅读以避免进一步的类似问题 Documentation
您可能需要运行此命令:
python manage.py collectstatic
来自您平台的 shell
如果你使用的是 heroku,这里是命令
heroku run python manage.py collectstatic
您的 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;
}
}