我正在使用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.py
和controllers.py
我试图访问全球cassandraSession
,但我一直在global name 'cassandraSession' is not defined
。我知道错误意味着什么,但我不确定为什么我会看到这个。我的理解是,我设置WSGI应用的方式允许在应用范围内访问cassandraSession
,不是吗?
我找到Preserving state in mod_wsgi Flask application但是......它并没有真正揭示我做错的事情。
答案 0 :(得分:0)
我的问题是我的进口地点。我对tp.wsgi
和__init__.py
进行了一些更改,我得到了我需要的工作。也就是说,从from app import cassandraSession
和cooldec.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.py
和controllres.py
进行
from app import cassandraSession
rows = cassandraSession.execute('select * from table')
新WSGI开发人员的提示:继续思考“在python中”。
+警告+
我还没有找到关于这是否安全的绝对答案。由于sqlalchemy处理连接池的方式,使用sqlalchemy执行此操作完全可以。到目前为止,我还没有意识到这对Cassandra / DSE是否安全,所以如果你使用这个帖子,请谨慎行事。