pythonanywhere上的媒体目录/文件出现问题

时间:2020-03-26 19:53:41

标签: python django django-models pythonanywhere

我在网站上投放媒体内容时似乎遇到了问题。在本地主机上运行时,一切正常。但是,当在任何地方部署到python时,当我尝试通过表单上传图像时,都会收到 FileNotFoundError 。 我已经仔细研究了一些相关主题的溢出问题,但是没有发现任何线程可以帮助我解决问题。

以下是提交图像上传表单时收到的确切错误:

pythonanywhere error message stack trace of error
在models.py(在localhost上可以正常使用)的resize方法似乎有问题

以下是适当的安装文件: settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
...
MEDIA_DIR = os.path.join(BASE_DIR, 'media')
# Media
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
IMAGES_DIR = os.path.join(MEDIA_URL,"images")

python anywhere static files setup

我认为该错误是由于images_path方法未重新调整正确的位置(但它可在localhost上使用)。这是存储图像并定义图像保存方式的模型: models.py

class Image(models.Model):

    # this might work?
    def images_path():
        return os.path.join(settings.IMAGES_DIR, 'usruploads')

    def resize(self):
        im = PIL.Image.open(self.image)
        size=(200,200)
        out = im.resize(size)
        out.save(self.image.__str__())

    def save(self, *args, **kwargs):
        super(Image, self).save(*args, **kwargs)
        self.resize()

    image      = models.ImageField(upload_to=images_path()[1:], max_length=255)

如果此信息有用,我还将抛出该站点的媒体目录结构。

media directory 1 media directory 2

这是我第一次尝试通过python在任何地方部署Django Web应用程序,因此希望此问题解决后,这是我永远不会犯的错误。


我已经实现了您建议的更改,并且所引用的url现在已经开始,但是服务器声称没有。 我已经打印出图像的URL和路径,如下所示: image paths 我可以转到索引页面并输入此URL,它会加载图像。

好的,您的建议是正确的 path 而不是__str __()有效。然后发生第二个问题的原因是由于我使用 url 打开图像并尝试使用 path 保存图像,但事实并非如此。感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

放弃

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

class Image(models.Model):

    # this might work?
    def images_path():
        return os.path.join(settings.IMAGES_DIR, 'usruploads')

    def resize(self):
        im = PIL.Image.open(self.image)
        size=(200,200)
        out = im.resize(size)
        out.save(self.image.__str__())

    def save(self, *args, **kwargs):
        super(Image, self).save(*args, **kwargs)
        self.resize()

    image = models.ImageField(upload_to=images_path()[1:], max_length=255)

我们可以推断出

IMAGES_DIR = "/media/images"

image = models.ImageField(upload_to='media/images/usruploads', max_length=255)

这意味着文件已上传到/<base_dir>/media/media/images/usruploads

问题

查看您的日志,该错误发生在日志末尾。

    ...
    out.save(self.image.__str__())

问题是self.image.__str__()返回文件的相对路径/文件名,当您将相对路径传递到out.save时,它将尝试将该文件保存在提供的路径中。工作目录。

解决方案

您要做的(假设您要替换原始图像)是通过原始图像的绝对路径:

    ...
    out.save(self.image.path)