簡體   English   中英

如何在OpenShift Tornado中提供上傳的圖像?

[英]How to serve uploaded images in OpenShift Tornado?

我正在使用OpenShift和Tornado創建站點,並且需要對圖像和其他文件使用永久存儲。 文檔說,在$ OPENSHIFT_DATA_DIR中存儲了什么持久性存儲路徑。 這是應用程序文件系統概述:

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

這是一個問題:我試圖從$ OPENSHIFT_DATA_DIR提供圖像和其他文件,但是它不起作用,因為$ OPENSHIFT_DATA_DIR放在wsgi路徑之外,所以我總是得到404。 我創建了一個並不孤單的人,使用OpenShift的Django / Java / Flask開發人員也遇到了同樣的問題。

我試圖從/ static文件夾提供文件,但這不是一個好主意:進行git push將刪除此處創建的所有新文件。

我試着做一些像這樣 ,但它不為我工作過。 也許我做錯了什么,並且需要重寫其他東西才能將這個技巧用於龍卷風?

有人能幫我嗎? 謝謝!

編輯

嘗試使用tornado.web.StaticFileHandler ,將其添加到這樣的處理程序中:

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

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

找到這樣的方式,龍卷風將__UPLOADS__+/media/img.jpgwsgi/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)

您絕對應該將媒體添加到項目根目錄之外的數據目錄中。 基本上,您使用MEDIA變量進行設置。 settings.py

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

然后在模型中使用:

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

如果這樣做沒有幫助,也許您可​​以創建從靜態文件夾到媒體根目錄的符號鏈接。 例如在部署動作掛鈎.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

基本上檢查日志中是否有任何錯誤,錯誤的路徑設置,您最終會到達那里。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM