我应该把图片上传到Django的静态目录吗?

2024-06-09 18:30:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含图像场的模型。在

from django.db import models
from django.contrib.auth.models import User


class Customer(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=127)
    logo = models.ImageField(upload_to='customer/logo', null=True, blank=True)

    def __str__(self):
        return self.name

在我看来,我从指定的url下载图像并将其存储在image字段中。对于测试,我使用测试用户作为外键。在

^{pr2}$

图像将按预期上载到customer/logo/test.png。现在,如何在前端显示这些图像?我可以将它们保存到静态文件目录中,但只有相关用户才能访问它。在

(顺便说一下,Django管理接口显示有一个为Customer对象上载的文件。但它链接到http://localhost:8000/admin/customer/customer/20/customer/logo/test.png,这是一个错误的位置,并导致一个找不到的页面。)


Tags: django用户namefromtest图像importself
1条回答
网友
1楼 · 发布于 2024-06-09 18:30:02

FileFieldImageField的文件是相对于settings.MEDIA_ROOT上载的,并且应该可以通过附加到settings.MEDIA_URL的相同相对文件名进行访问。这就是你的管理接口指向错误的url的原因。出于安全原因,它们应该与STATIC_ROOTSTATIC_URL不同,否则Django将引发一个ImproperlyConfiguredError。在

这将不会阻止用户访问他们不应该看到的文件,如果他们知道或能猜到网址。为此,您需要通过Django来提供这些私有文件,而不是您选择的web服务器。基本上,您需要在web根目录下指定一个私有目录,如果用户有权限查看该文件,则需要加载这些文件。E、 g.:

from django.core.files.storage import FileSystemStorage

PRIVATE_DIR = os.path.join(ROOT_DIR, 'web-private')
fs = FileSystemStorage(location=PRIVATE_DIR)

class Customer(models.Model):
    logo = models.ImageField(upload_to='customer/logo', storage=fs, null=True, blank=True)

在你看来,你必须提供这个文件。我当前项目中的一个自定义应用程序使用以下函数发送静态文件:

^{pr2}$

然后在视图中使用send_file(customer.logo)。在

Django>;=1.5应该使用新的StreamingHttpResponse,而不是{}。在

相关问题 更多 >