Django管理员在生产中上传了图片

问题描述 投票:0回答:1

我通过管理界面i生产上传的图像无法找到,虽然它存在于服务器上。它在开发中加载正常。我使用Django Image-kit来调整上传的图像大小。

图像没有显示在网站上,如果我按照图像网址,我得到

<h1>Not Found</h1>
<p>The requested URL /media/CACHE/images/references/<reference-name>/<image-name>/211b0022f8a2baad7cdc527711dcb.jpg was not found on this server.</p>

上传的图像未添加到正确显示的静态文件中。

我的模型看起来像这样:

def generate_unique_slug(instance, field):
    original = slugify(field)
    unique = original
    numb = 1
    while instance.objects.filter(slug=unique).exists():
        unique = f'{original}-{numb}'
        numb += 1
    return unique

def reference_main_image_path(instance, filename):
    sub_folder = instance.slug
    return f'references/{sub_folder}/{filename}'

class Reference(models.Model):
    title = models.CharField(max_length=60)
    description = models.TextField(max_length=2000)
    slug = models.SlugField(max_length=12, unique=True, blank=True)
    main_image = models.ImageField(
        upload_to=reference_main_image_path, default='default.png')
    main_thumbnail = ImageSpecField(source='main_image',
                                processors=[ResizeToFill(540, 300)],
                                format='JPEG',
                                options={'quality': 80},)
    tags = TaggableManager()

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if self.slug:
            if slugify(self.title) != self.slug:
                self.slug = generate_unique_slug(Reference, self.title)
        else:
            self.slug = generate_unique_slug(Reference, self.title)
        super().save(*args, **kwargs)

我的view.py

def reference(request):
    context = {
        'references': Reference.objects.all(),
    }
    return render(request, 'home/references.html', context)

在'html`代码中,我称之为'这样的图像:

<img src="{{ reference.main_thumbnail.url }}"> 

我的settings.py静态和媒体变量如下所示:

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

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

我跑manage.py collectstatic

我的upload_to应该改变吗?或者,如何在“收集静态”时告诉Django查看文件夹,然后更改html以查看静态文件夹?

对我来说,图像工具包的文档只应该考虑“发展”或者我错过了什么,这似乎很奇怪?

谢谢!

编辑:我正在制作中使用gunicorn和Nginx,但如上所述,我的静态文件加载得很好。

编辑2:Nginx conf:

server {
    server_name <server_names>;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/<user>/projects/<project>/<project>;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

我遗漏了一些certbot SSL配置。

编辑3:urls.py

from django.urls import path
from . import views
from django.conf.urls.static import static
from django.conf import settings


urlpatterns = [
    path('', views.home, name='home'),
    path('ydelser/', views.service, name='service'),
    path('referencer/', views.reference, name='reference'),
    path('kontakt/', views.contact, name='contact'),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
django django-imagekit
1个回答
1
投票

要使用nginx提供媒体文件,您应该像static一样添加适当的位置:

location /static/ {
    root /home/<user>/projects/<project>/<project>;
}

location /media/ {
    root /home/<user>/projects/<project>/<project>;
}

就像你在django中所做的那样:

...
STATIC_URL = '/static/'
...
MEDIA_URL = '/media/'

但是,如果您不想使用nginx(建议使用)提供媒体文件,并且仍希望使用django(不推荐)为它们提供服务,请确保该行

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

DEBUG = False时启用。

请注意,您不应将媒体文件视为静态文件 - 它们在逻辑上是不同的。虽然静态文件属于您的解决方案/项目并随其附带,但媒体文件不属于您的项目,通常由用户生成。

PS

如果您已在本地将某些文件上传到您的网站,那么它们的位置相应:

def reference_main_image_path(instance, filename):
    sub_folder = instance.slug
    return f'references/{sub_folder}/{filename}'

class Reference(models.Model):
    ...
    main_image = models.ImageField(
        upload_to=reference_main_image_path, default='default.png')

如果您没有将它们(位于上面配置的文件夹中的硬盘驱动器上的文件)复制到prod服务器 - 它们将不会显示。如果需要,手动复制它们,并将目标文件夹与nginx位置匹配。

© www.soinside.com 2019 - 2024. All rights reserved.