Как написать обработчик запросов Webapp2, чтобы разрешить клиенту получать данные после получения сообщения Channel API

В качестве продолжения еще один вопрос, который я задал, у меня есть основной вопрос о самом простом способе заставить сервер python webapp2 предоставлять данные json, которые слишком велики (около 100 КБ) для отправки в виде сообщения Channel API для клиент .

Сервер webapp2 генерирует несколько файлов данных в течение нескольких минут на основе запроса клиента, и я думаю, что хотел бы, чтобы API канала отправлял сообщения с URL-адресом клиенту, когда данные готовы, и клиент (приложение GWT) может выполнить HTTP-запрос GET для получения данных. Каждый файл данных уникален для клиента, поэтому сервер должен иметь обработчик запросов, который предоставит клиенту соответствующий файл данных.

Можете ли вы написать обработчик запросов, который может предоставить правильный файл данных непосредственно из другого обработчика запросов для этого конкретного клиента при вызове запроса? Или мне нужно сначала хранить данные с помощью Cloud SQL или хранилища данных, пока клиент не попросит об этом? Вот неполный пример кода того, что я хотел бы сделать:

class MainPage(webapp2.RequestHandler):
def get(self):
    ## This opens the GWT app    

class Service_handler(webapp2.RequestHandler):
def get(self, parameters):
    ## This is called by the GWT app and generates the data to be 
    ## sent to the client. 
    ## A channel API message is sent to the client with the url 
    ## for each data file generated.

class kml_handler(webapp2.RequestHandler):
def get(self, client_id):
    ##  I would like to return the correct data here when it is 
    ##  called by the client.  Do I need to store the data in  
    ##  Cloud SQL or the Data Store and then retrieve it
    ##  or can this handler take the results directly from the 
    ##  Service_handler as soon as it is generated?

app = webapp2.WSGIApplication([
                            webapp2.Route(r'/', handler=MainPage),
                            webapp2.Route(r'/Service/', handler=Service_handler),
                            webapp2.Route(r'/_ah/channel/<connected>/', handler = connection_handler),
                            webapp2.Route(r'/kml/<client_id>', handler = kml_handler)
                            ],
                          debug=True)

person dave    schedule 21.10.2012    source источник


Ответы (1)


Вы можете записывать файлы в хранилище BLOB-объектов и обслуживать эти файлы из хранилища BLOB-объектов.

Вот пример: https://developers.google.com/appengine/docs/python/blobstore/overview#Complete_Sample_App

person voscausa    schedule 22.10.2012
comment
Спасибо. Использование blobstore кажется лучшим решением. Однако на данный момент мне проще записать длинные текстовые данные в несколько записей в хранилище данных, а затем снова соединить их вместе, когда они запрашиваются в качестве ответа на http-запрос (что также работает). В конце концов я, скорее всего, перейду на использование blobstore. - person dave; 16.12.2012
comment
Вы также можете использовать свойство хранилища данных db.Text для сохранения строки json, а в NDB есть свойство json для сохранения объекта json. NDB позаботится о загрузке и дампе. - person voscausa; 16.12.2012