Django 1.10媒体(FileField)404

时间:2018-01-09 21:26:53

标签: python django postgresql nginx gunicorn

我的第一个问题,所以放轻松。我会尽可能详细地说明。

我的设置

  • django 1.10(我知道,我需要升级)
  • python 3.5。[某事]
  • postgres DB
  • gunicorn
  • nginx的

问题和我尝试过的事情

问题在于我提取了一个最近在本地运行良好的提交,突然之前没有一个模型的图像,以前变得很好,正在工作 - 我得到所有这些的404。我尝试了以下内容:

  • 查看之前的提交
  • 重新启动gunicorn(sudo systemctl restart gunicorn
  • 重新启动nginx
  • 重新启动postgresql
  • 使用python manage.py shell访问对象并检查它们是否仍与文件的URL相关联

我的代码在本地运行时有效 - 没有上传的图像/文件导致404s。与我的生产环境一样,logos文件夹位于我的项目的主目录中,而不是附加到media文件夹(其他答案和django文档建议的情况也是如此 - 这可能虽然是红鲱鱼。

我的浏览器控制台显示404并且它正试图从<domain.com>/media/logos/<filename>获取,即使它们已在<project_folder>/logos/<filename>中存储(我已经检查了文件结构)(即没有{{1}文件夹),但这从来没有问题。同样,在本地情况也是如此,但完全没问题。

我的代码和内容

在我的 models.py 中,我有这个字段:

media

...然后我在我的HTML文件中使用:

进行渲染
class Thing(models.Model):
    ...
    logo = models.FileField(upload_to='logos/', blank=True)

......这也是django docs所说的(而不是硬编码URL)。我在文档中读到文件存储为数据库中对象的一部分,因此引用带文件名的文件路径不一定有效(或类似),因此这是最佳选择。

据我所知,我的网址设置得很好:

<img class="..." src="{{ thing.logo.url }}>

...按照this answer(可能还有其他人)。

settings.py 中,没有文件路径或网址是硬编码的:它们都与urlpatterns = [ ... ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 相关。

os.path...MEDIA_URL = '/media/'未设置(默认为'')

我想不出任何其他有用的信息,但如果有,请告诉我。请帮忙!我目前有一个丑陋的替代文字的实时网站:(

1 个答案:

答案 0 :(得分:0)

  

静态(...)仅适用于开发。在生产中,您应该配置服务器(例如Apache或Nginx)来提供文件。请参阅Apache和modwsgi的示例。 - Alasdair Jan 9 at 22:12

感谢@Alasdair对您的上述评论 - 不幸的是我无法将其标记为答案,但却导致了这一点。

我没有设置Nginx来处理媒体文件 - 只有静态文件。所以我的Nginx conf文件现在看起来像这样:

location /static/ {
    root /home/<path>/<to>/<folder>;
}

location /media/ {
    root /home/<path>/<to>/<folder>;
}

我的Django应用程序然后将文件上传到一个意想不到的位置,所以我不得不将这些文件复制到正确的媒体文件位置并设置正确。