2013-09-15 2 views
0

Обучение WSGI; Я пытаюсь создать приложение WSGI, что:Закрытие подключения к общей базе данных в приложении WSGI

  • кэширует состояние через кучу запросов
  • открывает одно соединение с базой данных автокоммят для кучи запросов
  • создает курсор, чтобы иметь дело с каждым запросом

Так,

class RequestHandler: 
    def __init__(self, app, environ, start_response, cursor): 
     self.start_response = start_response 
     self.cursor = cursor 

    def __iter__(self): 
     self.start_response('200 OK', [('Content-type','text/plain')]) 
     yield do_stuff_with(self.cursor) 

    def close(self): 
     self.cursor.close() 


class Application: 
    def __init__(self): 
     self.connection = psycopg2.connect(database="site", user="www-data") 
     self.connection.set_isolation_level(0) 

    def __call__(self, environ, start_response): 
     return RequestHandler(self, environ, start_response, self.connection.cursor()) 

Итак, я в состоянии очистить состояние каждого запроса в RequestHandlerclose() метод; каков правильный способ очистки любого общего состояния, закрытия соединения с базой данных и т. д., когда сервер решает, что это сделано для всего приложения? Спецификация WSGI, похоже, не предоставляет никаких гарантий, эквивалентных по запросу close() - я что-то упустил? Или есть какая-то причина, почему это фундаментально ошибочный подход?

ответ

1

Вы можете использовать __del__ метод:

def __del__(self): 
    return self.close() 
+0

Я смотрел на это (изучение Python, как хорошо!), Но, например, главный ответ на http://stackoverflow.com/questions/6104535/i-dont-understand-this-python-del-behaviour означает, что он не является надежным для такого рода целей? – moonshadow

+0

Пойдет с этим пока что :) – moonshadow

Смежные вопросы