繁体   English   中英

Django 1.10媒体(FileField)404

[英]Django 1.10 media (FileField) 404

我的第一个问题,所以轻松点。 我会尽可能详细。

我的设定

  • django 1.10(我知道,我需要升级)
  • python 3.5。[某物]
  • Postgres数据库
  • 古尼康
  • Nginx的

问题和我尝试过的

问题是我撤回了最近在本地运行良好的提交,突然之间以前渲染良好的模型图像都无法正常工作-我正在为所有图像获取404。 我尝试了以下方法:

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

我的代码在本地运行时有效-没有上传的图像/文件引起404错误。 与我的生产环境一样, logos文件夹位于项目的主目录中,而不是附加到media文件夹中(其他答案和django文档建议的情况是这样-尽管这可能是一条红色的鲱鱼)。

我的浏览器控制台显示404,即使它已存储(已检查文件结构)在<project_folder>/logos/<filename> ,它仍试图从<domain.com>/media/logos/<filename>获取。 <project_folder>/logos/<filename> (即没有media文件夹),但这以前从来都不是问题。 同样,在本地也是如此,但是完全可以。

我的代码和东西

在我的models.py中,我有以下字段:

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

...然后我使用以下代码将其呈现在HTML文件中:

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

...这就是Django文档说的做到这一点的方法(而不是硬编码URL)。 我在文档中读到,该文件作为对象的一部分存储在数据库中,因此使用文件名引用文件路径不一定有效(或类似的操作),因此这是最佳选择。

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

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

...根据此答案 (可能还有其他答案 )。

settings.py中,没有文件路径或URL被硬编码:它们都是相对于os.path...

MEDIA_URL = '/media/'并且未设置MEDIA_ROOT (默认为'')

我想不出任何其他有用的信息,但是如果有的话让我知道。 请帮忙! 我目前有一个带有难看的alt-text的实时网站:(

静态(...)仅在开发中有效。 在生产中,您应该配置服务器(例如Apache或Nginx)来提供文件。 请参阅Apache和modwsgi的示例。 –阿拉斯代尔1月9日22:12

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM