Мне не удается заставить Passenger работать с Flask. Я запускаю сайт Flask на DreamHost внутри virutalenv, работающего под управлением Python 3.5.2. Приложение должно получать входные данные из строки запроса в URL-адресе, анализировать файл JSON на стороне сервера, искать в файле JSON указанную строку запроса, переформатировать JSON и отправить его обратно клиенту. Вместо этого он дает мне код ошибки 500. Вот мой код. Прошу прощения за все вызовы функций журналирования. Я сделал все, что мог, поискав вокруг.
import logging
logging.basicConfig(filename='wsgi_flask.log', level=logging.DEBUG)
try:
import sys, os
logging.info('line 7')
VENV = os.path.join(os.environ['HOME'], '.pyenv', 'versions', '3.5.2', 'envs', 'flask')
INTERP = os.path.join(VENV, 'bin', 'python')
logging.info('line 12')
if sys.executable != INTERP:
os.execl(INTERP, INTERP, *sys.argv)
logging.info('line 17')
sys.path.append(VENV)
sys.path.append(os.path.join(VENV, 'lib', 'python3.5', 'site-packages'))
sys.path.append(os.path.join(os.environ['HOME'], 'api.example.com'))
logging.info('line 23')
# INTERP = os.path.join(os.environ['HOME'], '.pyenv', 'versions', 'flask', 'bin', 'python')
# if sys.executable != INTERP:
# os.execl(INTERP, INTERP, *sys.argv)
# sys.path.append(os.getcwd())
from paste.exceptions.errormiddleware import ErrorMiddleware
logging.info('line 31')
# import argparse
import json
logging.info('line 36')
from flask import (Flask, abort, g, jsonify, make_response, redirect,
render_template, render_template_string, request, url_for, Response)
logging.info('line 41')
# parser = argparse.ArgumentParser()
# parser.add_argument('-d', '--debug', action='store_true')
# apargs = parser.parse_args()
# def debugLog(*args):
# if apargs.debug:
# for i in args:
# print(i)
application = Flask(__name__)
logging.info('line 54')
@application.route('/')
def index():
logging.info('line 58')
# if apargs.debug:
# data = json.load(open('/path/to/test.json', 'rb'))
# else:
logging.info('line 62')
try:
logging.info('line 64')
data = json.load(open('/path/to/test.json', 'rb'))
logging.info('line 66')
except:
logging.info('line 68')
logging.warning('Is it the JSON?')
raise('Error whilst loading JSON')
logging.info('line 71')
getForm = request.args.get('search') or ''
logging.info('line 73')
# debugLog(data, getForm)
jsonData = ""
logging.info('line 78')
for d in data:
logging.info('line 80 (for loop)')
# debugLog(d)
if getForm in d['text']:
logging.info('line 83 (for loop)')
jsonData = jsonData + str(d) + ','
logging.info('line 85 (for loop)')
logging.info('line 86 (for loop)')
logging.info('line 87 (out of loop)')
# debugLog(jsonData)
jsonData = str(jsonData)
logging.info('line 91')
jsonData = jsonData[:-1]
logging.info('line 93')
jsonData = jsonData.replace("'", '"')
logging.info('line 95')
jsonData = '[' + jsonData + ']'
logging.info('line 97')
# debugLog('\n', jsonData)
return Response(jsonify(json.loads(jsonData)), mimetype='application/json')
logging.info('line 101 (this should not show)')
@application.errorhandler(500)
def error(e):
logging.warning(e + '\n\n\n What\'s happening here')
return str(e)
logging.info('line 107')
application = ErrorMiddleware(application, debug=True, error_log='tmp/wsgi_error.log')
logging.info('line 109')
# if apargs.debug:
# application.run(host='0.0.0.0', debug=True, port=80)
except:
logging.warning('line 114 (beginning of outer most try-except)')
import sys, os
logging.warning('line 116')
from traceback import format_list, extract_tb
logging.warning('line 119')
(extype, value, trace) = sys.exc_info()
logging.warning('line 121')
sys.stderr.buffer.write("%s:%s\n%s" % (extype, value,''.join(format_list(extract_tb(trace)))))
logging.warning('line 124 (EOF)')
Это мое дерево каталогов:
.
|-- .python-version
|-- public
| |-- .htaccess
| |-- favicon.gif
| |-- favicon.ico
| |-- passenger_wsgi.py
| `-- quickstart.html
`-- tmp
`-- restart.txt
А это мой .htaccess:
PassengerPython /home/dh_user/.pyenv/versions/3.5.2/envs/flask/bin/python
<VirtualHost *:80>
# This Flask web app will use Python 3.0
ServerName api.example.com
DocumentRoot /home/dh_user/api.example.com/public
</VirtualHost>
Я использовал все приведенные ниже руководства для справки и справки:
https://help.dreamhost.com/hc/en-us/articles/215769548-Passenger-and-Python-WSGI https://www.phusionpassenger.com/library/walkthroughs/start/python.html https://www.byteconsole.com/get-flask-up-and-running-on-a-dreamhost-server-with-пассажира/
Изменить: Dreamhost не позволяет мне просматривать журналы пассажиров на общем хосте. Лучшее, что я могу вам дать, это мой error.log, который при каждом запросе дает мне
[Wed Apr 26 13:52:51 2017] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers:
[Wed Apr 26 13:52:51 2017] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: internal_error.html
Изменить 2: я использую модуль Paste Python для сбора ошибок из Flask, и он дает мне следующее:
File '/home/dh_user/.pyenv/versions/3.5.2/envs/flask/lib/python3.5/site-packages/paste/exceptions/errormiddleware.py', line 224 in next
return self.app_iterator.next()
AttributeError: 'ClosingIterator' object has no attribute 'next'