Размещение приложения Python Flask на AWS Ubuntu (EC2) с использованием cx_Oracle и mod_wsgi

Я пытаюсь разместить простой веб-сайт Python Flask, который подключается к базе данных Oracle.

До сих пор мне удалось установить cx_Oracle (а также клиент Oracle и SDK) на хост Ubuntu и успешно разместить приложение Flask с использованием Apache2 и mod_wsgi.

Я следовал этому руководству по установке cx_Oracle: Я выполнил это руководство для размещения: http://blog.garethdwyer.co.za/2013/07/getting-simple-flask-app-running-on.html

Все приложение отлично работает при локальном запуске из экземпляра. Я использовал x-forwarding и firefox, чтобы проверить это.

Однако, когда я пытаюсь разместить публично, работая через wsgi, он может загрузить приложение фляги, но терпит неудачу, когда его просят получить доступ к базе данных Oracle. Я не могу получить журналы ошибок, так как журналы Apache показывают только то, что я вручную распечатываю через Python. (Если у кого-то есть решение для ЭТОГО, сообщите, пожалуйста).

Я потратил слишком много времени, пытаясь организовать хостинг — это должно быть намного проще, чем есть на самом деле. Решения?

Моя структура каталогов

->/var/www/SACK
    ->app.py
    ->app.wsgi
    ->satic/
    ->templates/
->/etc/apache2/sites-available
    ->sitename.com.config
->/opt/oracle/instant_client_12_1
    ->... Oracle client stuff. SDK included.

app.py

app = Flask(__name__)

...

def connectToDB():
    ip = '...'
    port = ...
    SID = '...'

    dsn_tns = cx_Oracle.makedsn(ip, port, SID)
    global connection 
    connection = cx_Oracle.connect('...', '...', dsn_tns)

    print "connection successful"
    global cursor 
    cursor = connection.cursor()


def closeConnection():
    cursor.close()
    connection.close()
    print "connection closed"

def main():
    connectToDB()
    app.run()
    closeConnection()

if __name__ == '__main__':
    main()

Из этих руководств, вот как мое приложение настроено для wsgi:

app.wsgi

import sys
sys.path.insert(0, '/var/www/SACK')

from app import app as application

Конфигурация сайта:

имя_сайта.com.config

<VirtualHost *:80>
         WSGIDaemonProcess SACK
     WSGIScriptAlias / /var/www/SACK/app.wsgi

     <Directory /var/www/SACK>
            WSGIProcessGroup SACK
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
     </Directory>
LogLevel info
ErrorLog "/var/log/apache2/error.log"
CustomLog "/var/log/apache2/access.log" combine
</VirtualHost>

person USS1994    schedule 09.12.2015    source источник


Ответы (1)


Мой wsgi настроен на запуск только самого приложения Flask, то есть кода, содержащегося в app.run(), поэтому функция connectToDB() фактически никогда не запускается, когда wsgi создает приложение.

Вместо того, чтобы исправлять это в моей конфигурации wsgi, я использовал @app.before_request flask. () и аннотации @app.teardown_request для создания и уничтожения соединения с БД.

Изменения в коде:

@app.before_request()
def connectToDB():
    ....

@app.teardown_request()
def closeConnection(e):
    ....
person USS1994    schedule 10.12.2015