如何在OpenShift Tornado中提供上传的图像?

时间:2016-03-23 07:36:01

标签: python django file-upload openshift tornado

我正在使用OpenShift与Tornado创建一个站点,我需要为图像和其他文件使用持久存储。文档说,$ OPENSHIFT_DATA_DIR中存储了哪些持久存储路径。这是app文件系统概述:

 |-- app-root
 |   -- data # <--$OPENSHIFT_DATA_DIR
 |   -- repo # 
 |      -- wsgi
 |         -- static
 |            -- img
 |         -- templates
 |         -- ...
 |   -- runtime
 |       -- data
 |       -- repo
 |           -- ...deployed application code

在这里我遇到了一个问题:我尝试从$ OPENSHIFT_DATA_DIR提供图片和其他文件,但它不起作用,我总是得到404因为$ OPENSHIFT_DATA_DIR位于wsgi路径之外。我创建了我并不孤单的Django / Java / Flask开发人员使用OpenShift遇到同样的问题。

我尝试从/ static文件夹提供文件,但这不是一个好主意:让git push删除此处创建的所有新文件。

我尝试做this这样的事情,但它对我来说也不起作用。也许我做错了什么,需要重写一些其他的东西才能将这个技巧用于龙卷风?

有人能帮助我吗?谢谢!

修改

尝试使用tornado.web.StaticFileHandler,将其添加到这样的处理程序中:

__UPLOADS__ = str(os.environ.get('OPENSHIFT_DATA_DIR'))+"/uploads" ... 

handlers =     [(r'/',MainHandler,), 
               (r'/media/(.*)', tornado.web.StaticFileHandler, {'path': __UPLOADS__}), 
               ...,]

通过这种方式查找Tornado将__UPLOADS__+/media/img.jpg替换为wsgi/static/img.jpg

这是应用程序文件,也许它可以使事情变得清晰:

 #!/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)

1 个答案:

答案 0 :(得分:-1)

您绝对应该将媒体添加到项目根目录之外的数据目录中。基本上你使用MEDIA变量来设置它。在settings.py

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

在您的模型中,然后使用:

logo = models.ImageField(upload_to="logo")

如果这没有帮助,可能是您可以从静态文件夹创建符号链接到您的媒体根目录。例如,在deploy action hook .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

基本检查日志中是否有任何错误,错误的路径设置,最终你会到达那里。祝你好运!