在OpenShift中使用Django提供媒体文件(用户上传的文件)

12 投票
3 回答
3376 浏览
提问于 2025-04-18 07:18

我成功在openshift上部署了我的Django项目。但是我需要能够提供用户上传的文件。我使用了MEDIA_ROOT和MEDIA_URL来实现这个功能。我按照这个教程操作,但没有任何效果。我不得不更改MEDIA_ROOT,因为我觉得那里建议的路径不对。所以我的MEDIA_ROOT看起来是这样的:

MEDIA_ROOT = os.path.join(os.environ.get('OPENSHIFT_DATA_DIR', ''),'media')
MEDIA_URL = '/media/'

我在/wsgi文件夹里添加了.htaccess,正如文章中所说的那样。

RewriteEngine On
RewriteRule ^application/media/(.+)$ /static/$1 [L]    

我还创建了构建脚本,以便按照文章的说明在静态文件中创建媒体的符号链接。

#!/bin/bash
if [ ! -d $OPENSHIFT_DATA_DIR/media ]; then
    mkdir $OPENSHIFT_DATA_DIR/media
fi

ln -sf $OPENSHIFT_DATA_DIR/media $OPENSHIFT_REPO_DIR/wsgi/static/media

在我的urls.py文件中,我添加了:

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

但我仍然无法提供这些文件。我还尝试不在urls.py中包含django的静态方法,但结果还是一样。

另一个教程中,.htaccess被放在静态文件夹里。我是不是做错了什么?

3 个回答

1

我也遇到过同样的问题,不过Apostolos提供的解决办法并没有解决我的问题:当我尝试访问 http://<domain>/media/<file> 时,还是不行。

不过有另一种方式可以访问。如果我把同一个文件当作静态文件来访问,使用 http://<domain>/static/media/<file>,那就能正常工作。这种情况甚至在没有使用Gpzim98的解决方法的情况下也能发生。我觉得原因很简单,就是媒体文件现在可以通过符号链接访问。换句话说,媒体文件并没有被直接提供,但你可以假装它们是静态文件。

我很想搞清楚到底发生了什么,以及如何彻底解决这个问题(如果可以的话),希望能够直接通过MEDIA_URL提供媒体文件。

谢谢

2

问题出在你的媒体网址上。符号链接(symlink)是在 wsgi/static/media 这个位置创建的,所以你的 MEDIA_URL 应该设置为 MEDIA_URL = '/static/media/'。

第一步,在构建脚本 .openshift/action_hooks/build 中:

if [ ! -d $OPENSHIFT_DATA_DIR/media ]; then mkdir $OPENSHIFT_DATA_DIR/media fi

ln -sf $OPENSHIFT_DATA_DIR/media $OPENSHIFT_REPO_DIR/wsgi/static/media

第二步:在你的设置中:

MEDIA_URL = '/static/media/'

if ON_PAAS:
    MEDIA_ROOT = os.path.join(os.environ.get('OPENSHIFT_DATA_DIR'), 'media')
else: 
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
9

我只是想让其他人知道,我通过修改RewriteRule解决了我的问题,具体是把媒体文件夹加到了规则的第二部分,所以它变成了

RewriteEngine On
RewriteRule ^application/media/(.+)$ /static/media/$1 [L]  

希望这能帮助到其他人。

撰写回答