【问题标题】:Hosting a Python Flask App on AWS Ubuntu (EC2) using cx_Oracle and mod_wsgi使用 cx_Oracle 和 mod_wsgi 在 AWS Ubuntu (EC2) 上托管 Python Flask 应用程序
【发布时间】:2016-03-15 09:57:46
【问题描述】:

我正在尝试托管一个连接到 Oracle DB 的简单 Python Flask 网站。

到目前为止,我已经成功地在 Ubuntu 主机上安装了 cx_Oracle(以及 Oracle 客户端和 SDK),并使用 Apache2 和 mod_wsgi 成功地托管了 Flask 应用程序。

我按照本指南安装 cx_Oracle:https://blogs.oracle.com/opal/entry/configuring_python_cx_oracle_and 我按照本教程主持: 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

网站配置:

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>

【问题讨论】:

    标签: python amazon-ec2 flask mod-wsgi cx-oracle


    【解决方案1】:

    我的 wsgi 被配置为只运行实际的 Flask 应用程序本身,也就是 app.run() 中包含的代码,因此 connectToDB() 函数在 wsgi 创建应用程序时从未真正运行。

    我没有在我的 wsgi 配置中修复这个问题,而是使用了 flask 的 @app.before_request()@app.teardown_request 注释来创建和销毁数据库连接。

    代码的变化:

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

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 2016-08-07
      • 1970-01-01
      • 2017-03-22
      • 2021-05-20
      • 2016-04-14
      • 2018-06-29
      • 2017-06-12
      • 2014-08-05
      相关资源
      最近更新 更多