Журнал, что запрос был дан ответ после ответа - PullRequest
1 голос
/ 09 октября 2011

Это, вероятно, очень дурацкий вопрос, но я хочу убедиться, что мой код делает то, что, я думаю, делает.

Вот что мне нужно - получить запрос, принять решение, ответить на него запросом, и только потом регистрировать его. Последовательность важна, потому что запись может быть медленной, и я хочу убедиться, что ответ публикуется до того, как произойдет любая запись.

Вот пример кода:

class ConferenceGreetingHandler(webapp.RequestHandler):
def get(self):
    self.post()

def post(self):

    xml_template(self, 'templates/confgreeting.xml')

    new_log = Log()
    new_log.log = 'test'
    new_log.put()

Я думаю, что перед отправкой я отвечаю, это правда? Кроме того, есть ли лучший способ сделать это? Опять извините за супер нубишность ...

РЕДАКТИРОВАТЬ: Вот шаблон:

def xml_template(handler, page, values=None):
    path = os.path.join(os.path.dirname(__file__), page)
    handler.response.headers["Content-Type"] = "text/xml"
    handler.response.out.write(template.render(path, values))

Ответы [ 2 ]

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

Независимо от того, что вы делаете, App Engine не отправит ответ пользователю, пока ваш код обработчика не завершится. К сожалению, в настоящее время нет способа сказать App Engine «отправьте ответ, я больше не буду выводить».

У вас есть несколько вариантов:

  1. Просто поместите запись журнала синхронно. Записей в хранилище данных не так уж и дорого в отношении задержки на настенные часы, особенно если вы минимизируете количество необходимых обновлений индекса.
  2. Поставить задачу в очередь задач для записи данных журнала. Если вы используете очереди извлечения, вы можете извлекать записи журнала и записывать их партиями в хранилище данных из другой задачи или серверной части.
  3. Запустите запись в хранилище данных для записи журнала, как только у вас появятся соответствующие данные, и используйте асинхронную операцию, позволяющую перекрывать запись с некоторыми процессами обработки.
0 голосов
/ 09 октября 2011

Многое зависит от того, что делает xml_template.Если он делает self.response.write(...), то обработчик выполнил свою часть для обработки ответа.Фреймворк webapp сделает все остальное, как только ваш обработчик завершит работу нормально.

Я не уверен, к чему относится ваш вопрос о "лучшем способе", но выделяются две вещи.будет записывать в системный журнал, а не создавать Log экземпляр, который вы должны (возможно) отследить и удалить позже.

Во-вторых, если вы собираетесь широко использовать xml_template, сделайте егометод экземпляра.Создайте свой собственный подкласс webapp.RequestHandler, поместите туда xml_template, а затем создайте подкласс для своих конкретных обработчиков.

Обновлено: Я пропустил часть о желании получить ответ раньшеделает пишет.Если вы страдаете от медленной записи, сначала внимательно посмотрите, не переиндексируется ли записываемая сущность (индексируется в полях, к которым никогда не будет применен запрос).Если этого было недостаточно, чтобы получить производительность в приемлемом диапазоне, совет, который Ник дает, - это путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...