【问题标题】:Error 404 serving media files in a Django app hosted on DigitalOcean在 DigitalOcean 上托管的 Django 应用程序中提供媒体文件时出现错误 404
【发布时间】:2021-09-23 02:58:22
【问题描述】:

我正在制作一个小型 Django 应用程序,我想在生产环境中使用通过 Django 管理面板上传的文件
这是来自我的 settings.py 文件

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
MEDIA_URL = ''
MEDIA_ROOT = BASE_DIR

我信任管理员上传的文件并希望轻松提供它们(无需 Amazon S3 和类似服务),因此我尝试将上传的文件与其他静态文件放在一起

image = models.ImageField(upload_to='static/images')

通过管理面板上传图像后,我在 DigitalOcean 控制台中运行 python manage.py collectstatic。每当我尝试访问图像时,我都会收到错误 404,而所有其他静态文件(它们是真正的静态文件,不是通过管理面板上传的)加载成功

我在本地做了同样的事情,没有问题,一切都按预期加载(DEBUG=True 在本地和 DigitalOcean 上都设置了)。是不是某些安全措施不会让上传的文件以静态形式结束?如果我信任通过管理面板上传的文件,如何绕过它?

【问题讨论】:

    标签: python django digital-ocean


    【解决方案1】:

    如果您使用 manage.py runserver 运行您的网站

    首先确保媒体在您的主要urls.py 中提供服务

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

    那么您可以使用带有 --insecure 的 runserver 来运行您的网站,无论是否使用DEBUG=True

    python manage.py runserver 0.0.0.0:80 --insecure
    

    https://docs.djangoproject.com/en/3.2/ref/contrib/staticfiles/#cmdoption-runserver-insecure

    在 django 文档中,这不是提供文件的推荐方式,您应该使用反向代理,如 nginx 或 apache

    或者如果你真的不想使用反向代理,你可以试试 whitenoise http://whitenoise.evans.io/en/stable/django.html

    【讨论】:

    • 我尝试在主要的urls.py 中添加您建议的内容并进行部署,但我仍然收到 404 尝试访问图像。该应用由 DigitalOcean 使用 gunicorn --worker-tmp-dir /dev/shm django_app.wsgi 命令运行
    • 如果你使用 gunicorn,你最好使用 nginx 来提供所有你需要的文件。
    • 或者你可以在答案中使用manage.py runserver和配置
    猜你喜欢
    • 2012-09-07
    • 2018-01-24
    • 2015-02-28
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多