В Pyramid, как проверить, является ли представление статическим в обработчике событий NewRequest? - PullRequest
3 голосов
/ 23 октября 2011

У меня есть обработчик событий NewRequest (подписчик) в Pyramid, который выглядит следующим образом:

@subscriber(NewRequest)
def new_request_subscriber(event):
    request = event.request
    print('Opening DB conn')
    // Open the DB
    request.db = my_connect_to_db()
    request.add_finished_callback(close_db_connection)

Однако я заметил, что соединение с БД открывается, даже если запрос переходит к статическому активучто явно не нужно.Есть ли способ из обработчика NewRequest проверить, связан ли запрос со статическим ресурсом?Я пытался сравнить view_name с именем моего статического представления, но, очевидно, атрибут view_name недоступен на этой ранней стадии обработки запроса.

Если у кого-нибудь есть какие-либо интересные идеи по этому поводу, пожалуйста, дайте мне знать!

Ответы [ 2 ]

3 голосов
/ 24 октября 2011

Метод грубой силы заключается в сравнении переменной request.path с корнем статического представления, например, request.path.startswith('/static/').

. Метод, который мне больше всего нравится и используется в моих собственных приложениях, заключается в добавлении свойства.к request объекту с именем db, который лениво оценивается при доступе.Поэтому, хотя вы можете добавить его в запрос, он ничего не сделает, пока к нему не будет получен доступ.

import types

def get_db_connection(request):
    if not hasattr(request, '_db'):
        request._db = my_connect_to_db()
        request.add_finished_callback(close_db_connection)
    return request._db

def new_request_subscriber(event):
    request = event.request
    request.db = types.MethodType(get_db_connection, request)

Позже в вашем коде вы можете получить доступ к request.db(), чтобы получить соединение.К сожалению, невозможно добавить свойство к объекту во время выполнения (afaik), поэтому вы не можете настроить его так, чтобы request.db давал вам то, что вы хотите.Вы можете получить это поведение, не используя подписчика с помощью записи поваренной книги , где вы создаете подкласс Request и добавляете свое собственное свойство lazy через декоратор @reify Pyramid.

1 голос
/ 31 марта 2012
def _connection(request):
    print "******Create connection***"
    #conn = request.registry.dbsession()
    conn = MySQLdb.connect("localhost", "DB_Login_Name", "DB_Password", "data_base_name")
    def cleanup(_):
        conn.close()
    request.add_finished_callback(cleanup)
    return conn

@subscriber(NewRequest)
def new_request_subscriber(event):
    print "new_request_subscriber"
    request = event.request
    request.set_property(_connection, "db", reify = True)

попробуйте это, я ссылаюсь на следующую страницу http://pyramid.readthedocs.org/en/1.3-branch/api/request.html раздел "set_property", у меня работает.

...