簡體   English   中英

使用cx_Oracle和mod_wsgi在AWS Ubuntu(EC2)上托管Python Flask應用

[英]Hosting a Python Flask App on AWS Ubuntu (EC2) using cx_Oracle and mod_wsgi

我正在嘗試托管一個連接到Oracle DB的簡單Python Flask網站。

到目前為止,我已經設法在Ubuntu主機上安裝了cx_Oracle(以及Oracle Client和SDK),並使用Apache2和mod_wsgi成功托管了Flask應用程序。

我按照此指南安裝了cx_Oracle: https : //blogs.oracle.com/opal/entry/configuring_python_cx_oracle_,並且我按照本教程進行了托管: http : //blog.garethdwyer.co.za/2013/07/getting-simple- flask-app-running-on.html

從實例本地運行時,整個應用程序可以完美運行。 我已經使用x-forwarding和firefox對此進行了測試。

但是,當我嘗試通過wsgi運行公共主機時,它可以加載flask應用程序,但是在要求訪問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

站點配置:

sitename.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>

我的wsgi配置為僅運行實際的Flask應用程序本身,也就是app.run()包含的代碼,因此,當wsgi創建應用程序時, connectToDB()函數實際上不會運行。

我沒有在wsgi配置中解決此問題,而是使用flask的@ app.before_request()@ app.teardown_request批注創建和銷毀了數據庫連接。

代碼更改:

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

@app.teardown_request()
def closeConnection(e):
    ....

暫無
暫無

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

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