[英]How to serve uploaded images in OpenShift Tornado?
I am creating a site using OpenShift with Tornado and I need to use persistent storage for images and other files. 我正在使用OpenShift和Tornado创建站点,并且需要对图像和其他文件使用永久存储。 Documentation says, what persistent storage path stored in $OPENSHIFT_DATA_DIR.
文档说,在$ OPENSHIFT_DATA_DIR中存储了什么持久性存储路径。 Here is app file system overview:
这是应用程序文件系统概述:
|-- app-root
| -- data # <--$OPENSHIFT_DATA_DIR
| -- repo #
| -- wsgi
| -- static
| -- img
| -- templates
| -- ...
| -- runtime
| -- data
| -- repo
| -- ...deployed application code
And here I have a problem: I tried to serve images and other files from $OPENSHIFT_DATA_DIR, but it's doesn't work, I always get 404 because $OPENSHIFT_DATA_DIR placed outside of wsgi path. 这是一个问题:我试图从$ OPENSHIFT_DATA_DIR提供图像和其他文件,但是它不起作用,因为$ OPENSHIFT_DATA_DIR放在wsgi路径之外,所以我总是得到404。 I founded what I'm not alone and Django / Java / Flask developers using OpenShift having same problems.
我创建了一个并不孤单的人,使用OpenShift的Django / Java / Flask开发人员也遇到了同样的问题。
I tried to serve files from /static folder, but that was bad idea: making git push
will delete all new files founded here. 我试图从/ static文件夹提供文件,但这不是一个好主意:进行
git push
将删除此处创建的所有新文件。
I tried to do something like this , but it doesn't work too for me. 我试着做一些像这样 ,但它不为我工作过。 Maybe I doing something wrong and it need to rewrite something else to use this trick for Tornado?
也许我做错了什么,并且需要重写其他东西才能将这个技巧用于龙卷风?
Can someone help me? 有人能帮我吗? Thanks!
谢谢!
EDIT 编辑
Tried to use tornado.web.StaticFileHandler
, add it to handlers like this: 尝试使用
tornado.web.StaticFileHandler
,将其添加到这样的处理程序中:
__UPLOADS__ = str(os.environ.get('OPENSHIFT_DATA_DIR'))+"/uploads" ...
handlers = [(r'/',MainHandler,),
(r'/media/(.*)', tornado.web.StaticFileHandler, {'path': __UPLOADS__}),
...,]
Find what this way Tornado replace __UPLOADS__+/media/img.jpg
to wsgi/static/img.jpg
找到这样的方式,龙卷风将
__UPLOADS__+/media/img.jpg
为wsgi/static/img.jpg
Here is application file, maybe it can make something clear: 这是应用程序文件,也许可以弄清楚一些:
#!/usr/bin/env python
import os
import sys
if 'OPENSHIFT_REPO_DIR' in os.environ:
sys.path.append(os.path.join(os.environ['OPENSHIFT_REPO_DIR'], 'wsgi',))
virtenv = os.environ['OPENSHIFT_PYTHON_DIR'] + '/virtenv/venv'
os.environ['PYTHON_EGG_CACHE'] = os.path.join(virtenv, 'lib/python3.3/site-packages')
virtualenv = os.path.join(virtenv, 'bin/activate_this.py')
try:
exec(compile(open(virtualenv).read(), virtualenv, 'exec'),dict(__file__ = virtualenv))
except IOError:
pass
import tornado.wsgi
from openshift import handlers
if 'OPENSHIFT_REPO_DIR' in os.environ:
settings = {
'cookie_secret': 'TOP_SECRET',
'template_path' : os.path.join(os.environ['OPENSHIFT_REPO_DIR'], 'wsgi/templates'),
'xsrf_cookies': True,
'debug': True,
'login_url': '/login',
}
else:
settings = {
'cookie_secret': 'TOP_SECRET',
'template_path' : os.path.join(os.getcwd(), 'wsgi/templates'),
'xsrf_cookies': True,
'debug': True,
'login_url': '/login',
}
application = tornado.wsgi.WSGIApplication(handlers, **settings)
You definitely should add media to data directory out of your project root. 您绝对应该将媒体添加到项目根目录之外的数据目录中。 Basicly you use MEDIA variable to set this.
基本上,您使用MEDIA变量进行设置。 In
settings.py
: 在
settings.py
:
MEDIA_ROOT = os.environ.get('OPENSHIFT_DATA_DIR', '')
MEDIA_URL = '/media/'
In your model then use: 然后在模型中使用:
logo = models.ImageField(upload_to="logo")
If this does not help, may be you can create symlink from static folder to your media root. 如果这样做没有帮助,也许您可以创建从静态文件夹到媒体根目录的符号链接。 For example in deploy action hook
.openshift/action_hooks/deploy
: 例如在部署动作挂钩
.openshift/action_hooks/deploy
:
#!/bin/bash
source ${OPENSHIFT_HOMEDIR}python/virtenv/bin/activate
export PYTHON_EGG_CACHE=${OPENSHIFT_HOME_DIR}python/virtenv/lib/python-2.7/site-packages
echo "Executing 'python ${OPENSHIFT_REPO_DIR}wsgi/APP_NAME/manage.py migrate --noinput'"
python "$OPENSHIFT_REPO_DIR"wsgi/APP_NAME/manage.py migrate --noinput
echo "Executing 'python ${OPENSHIFT_REPO_DIR}wsgi/APP_NAME/manage.py collectstatic --noinput -v0'"
python "$OPENSHIFT_REPO_DIR"wsgi/APP_NAME/manage.py collectstatic --noinput -v0
if [ ! -d $OPENSHIFT_REPO_DIR/wsgi/static/ ]; then mkdir $OPENSHIFT_REPO_DIR/wsgi/static/; fi
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
Basicly check logs for any errors, wrong path settings and you will get there eventually. 基本上检查日志中是否有任何错误,错误的路径设置,您最终会到达那里。 Good luck!
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.