Django正在生产中,可以存储媒体文件但找不到

时间:2018-07-30 17:28:47

标签: django image media pythonanywhere

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

家庭/ [用户名] / [项目名称] / media / profile_picture

以下是相关的代码段:

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找不到

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

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

尽管如此,这是python manage.py collectstatic的结果

4 个答案:

答案 0 :(得分:3)

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

How to serve static files on pythonanywhere.

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

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

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

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

答案 1 :(得分:0)

只需从

切换
  

{{profile.profile_picture.url}}

  

{{profile.profile_picture.path}}

答案 2 :(得分:0)

尝试一下,将{{MEDIA_URL}}添加到src:

declare @whereCondition varchar(100)

if(@first='' && @second='')
 @whereCondition=ProductType = 1 AND ProductLevel = 1
else if(@first<>'' && @second='')
 @whereCondition=ProductType = 2 AND ProductName LIKE  @first + '%'
else if(@first='' && @second<>'')
 @whereCondition=ProductType =3 AND ProductName LIKE  @second + '%'

exec('SELECT ProductID, ProductName, ProductType, ProductLevel
FROM ProductTable where=@whereCondition')

答案 3 :(得分:-2)

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