【问题标题】:Django in production, can store media file but cannot find it生产中的Django,可以存储媒体文件但找不到它
【发布时间】:2018-07-30 17:28:47
【问题描述】:

我刚刚将我的项目投入生产。我有一个功能,用户可以上传自己的个人资料图片。人们可以上传他们的图片,它甚至存储在正确的目录中。然而,当我尝试实现它时,我得到一个 404 not found 错误。我正在使用 Pythonanywhere,所有图片都存储在路径:

主页/[用户名]/[项目名称]/media/profile_picture

以下是相关代码sn-ps:

settings.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

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

urls.py

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

models.py

class Person(models.model):
    ...
    profile_picture = models.ImageField(upload_to="profile_picture", blank=True, null=True)
    ...

profile_page.html

...
    <div class="photo-container">
        {% if profile.profile_picture %}
            <img src="{{ profile.profile_picture.url }}">
        {% else %}
            <img src="{% static 'external_page/assets/img/placeholder.png' %}">
        {% endif %}
    </div>
...

当我隔离标签时:

{{ profile.profile_picture.url }}

我明白了:

/media/profile_picture/[name_of_image_file].jpg

更新:

我怀疑错误在于文件的提供,而不是我引用它的路径。我怀疑因为我也得到了 404 not found

我明确尝试访问媒体字段的 url (https://www.website.com/media/profile_picture/[name_of_image_file.jpg]),

虽然我能够访问相应的静态文件。 (https://www.website.com/media/assets/[some_asset])

虽然,这是 python manage.py collectstatic 的结果

【问题讨论】:

  • 请添加呈现 profile_page.html 的视图,以获取有关您在配置文件中呈现的内容的更多信息。
  • 转到管理仪表板,尝试在那里添加图片,并注意更改。只需单击图片路径即可查看图片的真实路径。 (在管理仪表板中执行所有操作)并告诉我们
  • 你在生产中使用 nginx 吗?
  • 在管理仪表板上添加图像会产生相同的负面结果。
  • 是的,使用了nginx。

标签: django image media pythonanywhere


【解决方案1】:

您需要将 URL 和目录路径添加到您的媒体文件中。在 pythonanywhere 的 Webapp 部分。

我可以看到你的情况。您的 MEDIA_ROOT 是:

MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "media")

因此,在 目录 中,您必须输入 /home/username/media 而不是 /home/username/media_cdn.

这就是我解决问题的方法,希望对您有所帮助。

【讨论】:

    【解决方案2】:

    直接切换

    {{ profile.profile_picture.url }}

    到

    {{ profile.profile_picture.path }}

    【讨论】:

    • 你用的是什么版本的django?
    • 我使用的是 Django 2.07
    • 然后代替 .path 或 .url 尝试不使用任何东西,{{ profile.profile_picture }}
    • 那也没用。它产生:/profile_picture/[name_of_image_file].jpg 这也是一个 404。
    【解决方案3】:

    试试这个,将 {{ MEDIA_URL }} 添加到 src:

    <img src="{{ MEDIA_URL }}{{ profile.profile_picture.url }}">
    

    【讨论】:

    • 那行不通。但是,我注意到上下文变量 {{ MEDIA_URL }} 没有设置为任何值。这可能是问题的一部分吗?
    • @Alien13 是的,我想是的:MEDIA_URL = '/media/',或者你媒体的相对路径,和你配置/static/路径一样。
    • 我的意思是在你的 settings.py 文件中。
    • 是的,我已经添加了。
    【解决方案4】:

    您将文件存储在 pythonanywhere 实例的文件系统中。我没有在任何地方使用过pythonanywhere,但可能那里的文件不是持久的。您需要将媒体文件存储在 S3 等持久存储中。我强烈建议您使用django-storages 为您处理此问题。设置需要一些时间,但它会解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-15
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2015-08-17
      • 2016-07-16
      相关资源
      最近更新 更多