pythonanywhere 上的媒体 directory/files 出现问题
Trouble with media directory/files on pythonanywhere
我似乎无法在我的网站上提供媒体内容。在本地主机上 运行 时一切正常。但是,当部署到 python 任何地方时,当我尝试通过表单上传图像时收到 FileNotFoundError。
我已经查看了一些相关主题的溢出,但是我没有找到任何线程可以让我解决我的问题。
这是提交图片上传表单时收到的确切错误:
models.py 中的调整大小方法似乎有问题(在本地主机上工作正常)
以下是相应的安装文件:
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")
我认为错误是由于 images_path 方法没有重新调整正确的位置(但它适用于本地主机)。这是存储图像并定义图像保存方式的模型:
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)
如果此信息有用,我还会提供网站的媒体目录结构。
这是我第一次尝试通过 python 在任何地方部署 Django 网络应用程序,所以希望一旦这个问题得到解决,我再也不会犯这个错误。
我已经实施了您建议的更改,并且引用的 url 存在,这现在是一个开始,但服务器声称它不存在。
我已经打印出图像的 URL 和路径如下:
我可以转到索引页面并输入此 url 并加载图像。
好的,您的建议是正确的,因为 path 而不是 __str__() 有效。出现第二个问题的原因是我使用 url 打开图像并尝试使用 path[= 保存它47=] 它不喜欢这样。感谢您的帮助!
给定
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__()
returns 文件的相对 path/filename ,当您将相对路径传递给 out.save
时,它会尝试保存该文件在提供的相对于当前工作目录的路径中。
解决方案
你要做的(假设你想替换原始图像)是传递原始图像的绝对路径:
...
out.save(self.image.path)
我似乎无法在我的网站上提供媒体内容。在本地主机上 运行 时一切正常。但是,当部署到 python 任何地方时,当我尝试通过表单上传图像时收到 FileNotFoundError。 我已经查看了一些相关主题的溢出,但是我没有找到任何线程可以让我解决我的问题。
这是提交图片上传表单时收到的确切错误:
models.py 中的调整大小方法似乎有问题(在本地主机上工作正常)
以下是相应的安装文件: 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")
我认为错误是由于 images_path 方法没有重新调整正确的位置(但它适用于本地主机)。这是存储图像并定义图像保存方式的模型: 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)
如果此信息有用,我还会提供网站的媒体目录结构。
这是我第一次尝试通过 python 在任何地方部署 Django 网络应用程序,所以希望一旦这个问题得到解决,我再也不会犯这个错误。
我已经实施了您建议的更改,并且引用的 url 存在,这现在是一个开始,但服务器声称它不存在。
我已经打印出图像的 URL 和路径如下:
好的,您的建议是正确的,因为 path 而不是 __str__() 有效。出现第二个问题的原因是我使用 url 打开图像并尝试使用 path[= 保存它47=] 它不喜欢这样。感谢您的帮助!
给定
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__()
returns 文件的相对 path/filename ,当您将相对路径传递给 out.save
时,它会尝试保存该文件在提供的相对于当前工作目录的路径中。
解决方案
你要做的(假设你想替换原始图像)是传递原始图像的绝对路径:
...
out.save(self.image.path)