Делать что-то * после * обработки запроса в Google App Engine - PullRequest
2 голосов
/ 15 января 2010

Я бы хотел, чтобы GAE сделал что-то еще, как только мое приложение отправило ответ.

Обработчик будет выглядеть так:

class FooHandler(webapp.RequestHandler):
    def post(self):
        self.response.out.write('Bar')
        send_response()     # this is where I need help!
        do_something_else() # at this point, the response should have been sent

Если вам интересно, почему я пытаюсь это сделать:

Мне нужно потоковое поведение, которое не разрешено в изолированной среде GAE. Итак, функция отправляет несколько запросов без заботы об ответе. Каждый запрос запускает трудоемкую операцию (получение ресурсов) и сохраняет результат в хранилище данных, где он может использоваться первой функцией.

Примечание. Обработчик запроса имеет для отправки ответа. Если вы не предоставите ничего, он будет ждать завершения функции post , а затем вернет заголовки по умолчанию (что, конечно, не так, как я ищу)

Если это может помочь, решение может заключаться в использовании пользовательского промежуточного ПО wsgi, но я не знаю, как оно работает (пока) ...

Ответы [ 4 ]

9 голосов
/ 15 января 2010

Может быть, вы можете использовать Очереди задач .

2 голосов
/ 19 января 2010

Как уже упоминалось, вы можете использовать очереди задач или отложенный API . Rafe Kaplan обрисовал еще один вариант в конце своего раздела в этот разговор здесь : вы можете выполнить асинхронный вызов API с функцией обработчика результата для обработки результата, и обработчик результата будет вызван, когда вызов завершается, после ответ возвращается пользователю!

1 голос
/ 15 января 2010

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

http://code.google.com/p/modwsgi/wiki/RegisteringCleanupCode

Хотя это из документации mod_wsgi, очистка в конце примера запроса должна работать для любого стека, совместимого с WSGI.

0 голосов
/ 15 января 2010

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

...