在OpenShift中使用Django提供媒体文件(用户上传的文件)
我成功在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 个回答
我也遇到过同样的问题,不过Apostolos提供的解决办法并没有解决我的问题:当我尝试访问 http://<domain>/media/<file>
时,还是不行。
不过有另一种方式可以访问。如果我把同一个文件当作静态文件来访问,使用 http://<domain>/static/media/<file>
,那就能正常工作。这种情况甚至在没有使用Gpzim98的解决方法的情况下也能发生。我觉得原因很简单,就是媒体文件现在可以通过符号链接访问。换句话说,媒体文件并没有被直接提供,但你可以假装它们是静态文件。
我很想搞清楚到底发生了什么,以及如何彻底解决这个问题(如果可以的话),希望能够直接通过MEDIA_URL提供媒体文件。
谢谢
问题出在你的媒体网址上。符号链接(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')
我只是想让其他人知道,我通过修改RewriteRule解决了我的问题,具体是把媒体文件夹加到了规则的第二部分,所以它变成了
RewriteEngine On
RewriteRule ^application/media/(.+)$ /static/media/$1 [L]
希望这能帮助到其他人。