0

Так у меня есть класс BlobstoreUploadHandler, что использует put_async и ждать, как так:put_async, подожди, и обратные вызовы, как ускорить страницу переадресации после асинхронной загрузки

x = Model.put_async() 
    x.wait() 

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

redirecthref = '%s/serve/%s' % (
    self.request.host_url, Model.uploadid) 
    self.response.headers['Content-Type'] = 'application/json' 
    obj = { 'success' : True, 'redirect': redirecthref } 
    self.response.write(json.dumps(obj)) 

это все работает хорошо, однако, требуется сумасшедшее количество времени для этого редиректа случиться, мы говорим минут, и пока файл загружается, страница полностью заморожена. Я заметил, что у меня есть доступ к ссылке, которую javascript будет перенаправлять, даже когда происходит загрузка, и страница заблокирована, поэтому мой вопрос заключается в том, какие стратегии я могу предпринять, чтобы перенаправление произошло правильно, когда URL становится доступным? Это то, что для параметра callback для put_async, или это, где я хочу посмотреть url_fetch.

Мне очень понравилось это, и всякая помощь приветствуется. Благодаря!

UPDATE:

Так я понял, что загрузка идет медленно по нескольким причинам: я должен использовать положить(), а не put_aync(), который я нашел действительно ускорить время загрузки однако что-то ломается, и это дает мне ошибку 500, которая выглядит как:

POST http://example.com/_ah/upload/AMmfu6au6zY86nSUjPMzMmUqHuxKmdTw1YSvtf04vXFDs-…tpemOdVfHKwEB30OuXov69ZQ9cXY/ALBNUaYAAAAAU-giHjHTXes0sCaJD55FiZxidjdpFTmX/ 500 (Internal Server Error) 

он по-прежнему будет загружать как ресурсы, но редирект не работает. Я считаю, что это происходит на созданном upload_url, который создается с помощью

upload_url = blobstore.create_upload_url('/upload') 

Все, что в стороне, даже используя положить() вместо put_async(), метод ожидания() по-прежнему берет непомерное количество времени. Если удалить x.wait(), загрузка будет все еще может случиться, но редирект дает мне:

IndexError: List index out of range 

эта ошибка возникает в следующей строке моего/служить класс обработчика

qry = Model.query(Model.uploadid == param).fetch(1)[0] 

Итак, я считаю, что самый быстрый способ обслуживать объект после загрузки - вынуть x.wait() и вместо этого использовать try: и за исключением: в запросе, чтобы он продолжал пытаться обслуживать страницу до тех пор, пока она не будет получите ошибку listindex. Как я уже сказал, им очень нравится это, поэтому на самом деле это происходит немного над моим уровнем мастерства, поэтому любые мысли или комментарии очень ценятся, и я всегда рад предложить больше кода и объяснений. Благодаря!

ответ

1

Асинхронные звонки - это отправка чего-то на задний план, когда вы НЕ ДЕЙСТВИТЕЛЬНО заботитесь о его завершении. Кажется, вы ищете пот.

По определению put_async не должен заканчиваться быстро. Он отправляет что-то обратно, когда ваш экземпляр успевает это сделать. Думаю, ты ищешь. Это заморозит ваше приложение так же, как и ваше ожидание, но вместо того, чтобы ждать LONG-времени для завершения async, он начнет работать над этим сразу.

как сказано в документации асинхронном (https://developers.google.com/appengine/docs/java/datastore/async):

Однако, если приложению требуется результат ГЭТ(), а также в результате запроса, чтобы сделать ответ, и если получим() и Query не имеет каких-либо зависимостей данных, а затем до тех пор, пока get() не завершит запрос, это пустая трата времени.

Не похоже, что вы делаете. Вы используете асинхронный вызов в чисто синхронизированном виде. Это займет больше времени, чем просто. Если нет причин для того, чтобы нажать «положить» на большее, вы не должны использовать async

+0

Спасибо за это @Julldar, очень полезно. Я попытался заменить put_async() на put(), и он действительно ускоряет время загрузки, однако он также выдает ошибку 500, которая выглядит так: 'POST http://example.com/_ah/upload/AMmfu6au6zY86nSUjPMzMmUqHuxKmdTw1YSvtf04vXFDs - ... tpemOdVfHKwEB30OuXov69ZQ9cXY/ALBNUaYAAAAAU-giHjHTXes0sCaJD55FiZxidjdpFTmX/500 (Внутренняя ошибка сервера) ' Я считаю, что это происходит на созданном upload_url, который создается с помощью ' upload_url = blobstore.create_upload_url ('/ загрузки') ' это еще загружает оба ресурса, но перенаправление не работает. – hypastrophe

+0

hmmmm .... Я знаю, что во время загрузки у нас были проблемы при попытке загрузить что-то и получить к нему доступ сразу, из-за возможной последовательности, вызывающей огромные проблемы ... Интересно, так ли это с тобой и с вами? – Patrice

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