2016-03-23 1 views
0

Я создаю сайт с использованием OpenShift с Tornado, и мне нужно использовать постоянное хранилище для изображений и других файлов. В документации говорится, какой постоянный путь хранения хранится в $ OPENSHIFT_DATA_DIR. Вот обзор приложения Файловая система:Как загружать загруженные изображения в OpenShift Tornado?

|-- 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, с теми же проблемами.

Я попытался обслуживать файлы из/статической папки, но это была плохая идея: при создании git push удалятся все новые файлы, созданные здесь.

Я попытался сделать что-то вроде this, но он не работает тоже для меня. Может быть, я что-то делаю неправильно, и мне нужно переписать что-то еще, чтобы использовать этот трюк для Tornado?

Может кто-нибудь мне помочь? Благодаря!

EDIT

Пытались использовать 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.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) 
+0

Если вы используете Tornado, это означает, что вы предоставили файл app.py. Это отключает использование Apache/mod_wsgi, поэтому статический каталог не используется. Вам нужно будет найти какой-то код специально для фреймворка TornadoWeb, который может обслуживать статические файлы через ваш код Python. Например, http://stackoverflow.com/questions/10165665/using-tornado-how-do-i-serve-static-files-and-serve-a-favicon-ico-from-a-differ –

+0

У меня есть обработчики прав доступа например: '__UPLOADS__ = str (os.environ.get ('OPENSHIFT_DATA_DIR')) +"/uploads " ... обработчики = [(r '/', MainHandler,), (r '/ media/(. *) ', tornado.web.StaticFileHandler, {' path ': __UPLOADS__}), ... ' Теперь торнадо перенаправляет его на'/static/2431aa15-61b2-4de6-9d71-6009bbcc4bf3.jpg', но не '/ uploads'. И 404 снова – ashchuk

+0

Сначала вы создали каталог '' uploads''? –

ответ

-1

Обязательно необходимо добавить носитель в каталог данных из корня проекта. В основном вы используете переменную 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 

Основном проверки журналов для любых ошибок, неправильные настройки пути и вы получите там в конце концов. Удачи!

+0

Этот ответ правильный для Django, но не Tornado. Я сказал это в вопросе, что я пробовал, и он не работает – ashchuk

 Смежные вопросы

  • Нет связанных вопросов^_^