保存数据库池的Flask,WSGI和全局变量

时间:2015-03-13 21:28:42

标签: python flask global wsgi

我正在使用WSGI / Apache2并尝试在init上声明我的数据库池,以便可以通过端点的全局变量访问。我使用的是Redis和Cassandra(特别是DSE)。我的理解是,Redis和DSE库都提供了池管理,所以这不应该是一个问题。

我的WSGI应用程序的文件夹结构类似于

folder/
    tp.wsgi
    app/
        __init__.py
        decorators/
            cooldec.py
        mod_api/
            controllers.py

tp.wsgi如下所示

#! /usr/bin/env python2.7

import sys
import logging

logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, "/opt/tp")

from app import app

def application(environ, start_response):
    return app(environ, start_response)

__init__.py如下所示

#! /usr/bin/env python2.7

from flask import Flask
from cassandra.cluster import Cluster

# Import our handlers
from app.mod_api.files import mod_files

# Setup routine 
def setup():

    # Instantiate Flask
    app                     =       Flask('app')

    # Set up a connection to Cassandra
    cassandraSession = Cluster(['an ip address', 'an ip address']).connect('keyspace')
    cassandraSession.default_timeout = None 

    # Register our blueprints  
    app.register_blueprint(mod_files)
    ...

    return app, cassandraSession

app, cassandraSession = setup()

我正在调用cooldec.py中定义的处理身份验证的装饰器(由于某种原因,我松散地使用该术语。我要求我们不要沿着使用Flask扩展进行身份验证的路径,&# 39;超出了这个问题的范围,并且不适用于我的使用[见:松散使用术语'认证']

cooldec.pycontrollers.py我试图访问全球cassandraSession,但我一直在global name 'cassandraSession' is not defined。我知道错误意味着什么,但我不确定为什么我会看到这个。我的理解是,我设置WSGI应用的方式允许在应用范围内访问cassandraSession,不是吗?

我找到Preserving state in mod_wsgi Flask application但是......它并没有真正揭示我做错的事情。

1 个答案:

答案 0 :(得分:0)

我的问题是我的进口地点。我对tp.wsgi__init__.py进行了一些更改,我得到了我需要的工作。也就是说,从from app import cassandraSessioncooldec.py

中调用controllers.py

以下是我如何设置上述内容。

tp.wsgi

#! /usr/bin/env python2.7

import sys
import logging

logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, "/opt/tp")

from app import app as application

__init__.py

#! /usr/bin/env python2.7

# API Module

from flask import Flask, jsonify
from cassandra.cluster import Cluster

# Create our API
app                     =       Flask('app')

# Define a cassandra cluster/session we can use
cassandraSession = Cluster(['an ip address' 'an ip address']).connect('keyspace')
cassandraSession.default_timeout = None

... Register blueprints

这些是过于简化的编辑,但它提供了我做错的想法(例如:声明错误的文件并尝试导入不正确。

我们现在可以cooldec.pycontrollres.py进行

from app import cassandraSession
rows = cassandraSession.execute('select * from table')

新WSGI开发人员的提示:继续思考“在python中”。

+警告+

我还没有找到关于这是否安全的绝对答案。由于sqlalchemy处理连接池的方式,使用sqlalchemy执行此操作完全可以。到目前为止,我还没有意识到这对Cassandra / DSE是否安全,所以如果你使用这个帖子,请谨慎行事。