如何在Python中创建一个可以从不同模块访问的实例?

2024-06-08 02:16:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个连接到数据库的web应用程序。我目前正在一个模块中使用一个从其他模块导入的变量,但这感觉很糟糕。在

# server.py
from hexapoda.application import application

if __name__ == '__main__':
  from paste import httpserver
  httpserver.serve(application, host='127.0.0.1', port='1337')

^{pr2}$
# hexapoda/tickets/controllers.py
from hexapoda.application import db

def index(request, params):
  tickets = db.query(Ticket)

问题是我得到了到数据库的多个连接(我想因为我在两个不同的模块中导入application.py,所以Session.connect()函数执行了两次)。在

如何在不创建多个连接的情况下从多个模块访问db(即在整个应用程序中只调用Session.connect())?在


Tags: 模块frompyimportweb数据库应用程序db
2条回答

尝试使用以下内容的Twisted框架:

from twisted.enterprise import adbapi

class db(object):

    def __init__(self):
        self.dbpool = adbapi.ConnectionPool('MySQLdb',
            db='database',
            user='username',
            passwd='password')

    def query(self, sql)
        self.dbpool.runInteraction(self._query, sql)

    def _query(self, tx, sql):
        tx.execute(sql)
        print tx.fetchone()

这可能不是你想做的-每个应用程序只有一个连接意味着你的应用程序无法扩展。在

通常的解决方案是在请求进来时连接到数据库,并将该连接存储在一个具有“request”作用域的变量中(即它与请求一样长)。在

实现这一点的一个简单方法是将其放入request

request.db = ...connect...

您的web框架可能提供了一种方法来注释方法,或者类似于一个可以看到所有请求的过滤器。在那里输入打开/关闭连接的代码。在

如果打开连接很昂贵,请使用连接池。在

相关问题 更多 >

    热门问题