python - 将同一张带有附件的卡推送给我的玻璃器皿的许多用户的最佳方法

标签 python google-app-engine google-mirror-api

我正在尝试清理并放入类似产品的代码,但我在 Google App 引擎的产品环境中遇到了很多问题。 一切都在本地工作,没有任何问题,但每次我尝试在产品上测试时,我都会遇到截止日期和超时问题。 我的问题是: 1)从我的玻璃器皿中将带有相同附件(视频)的相同卡推送给许多用户的最佳/建议做法是什么。 这是从队列中调用的类:

class batchWorker(webapp2.RequestHandler):
def post(self):
    userToPush = self.request.get('user_id')
    #posting video
    media_link = util.get_full_url(self, '/static/video/short_from_glass_low.mp4')
    resp = urlfetch.fetch(media_link, deadline=2000)
    media_video = MediaIoBaseUpload(io.BytesIO(resp.content), mimetype='video/mp4',
                                        resumable=False)
    users = Credentials.all()
    for user in users:
            creds = StorageByKeyName(Credentials, user.key().name(), 'credentials').get()
            mirror_service = util.create_service('mirror', 'v1', creds)
            #first card
            timeline_item01 = {'text':'New video from bundle - Test002'}
            timeline_item01['bundleId'] = 'video_001'
            timeline_item01['isBundleCover'] = 'true'
            mirror_service.timeline().insert(body=timeline_item01).execute()
            #second card
            timeline_item = {'text': 'Text here'}
            timeline_item['isBundleCover'] = 'false'
            timeline_item['bundleId'] = 'video_001'
            mirror_service.timeline().insert(body=timeline_item, media_body=media_video).execute()
            logging.info("Posted video for user %s" % user.key().name())

这就是我将其推送到队列的方式:

taskqueue.add(url='/worker', params={'user_id': '103012621006129330069'})

有时我完成了这个,其他一些我得到的日志如下:

2013-08-01 07:15:37.695 /worker 500 6481ms 0kb AppEngine-Google; (+http://code.google.com/appengine)
I 2013-08-01 07:15:31.676 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-08-01 07:15:31.677 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:31.711 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-08-01 07:15:31.712 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:31.713 URL being requested: https://www.googleapis.com/discovery/v1/apis/mirror/v1/rest?userIp=0.1.0.2
I 2013-08-01 07:15:31.770 URL being requested: https://www.googleapis.com/mirror/v1/timeline?alt=json
I 2013-08-01 07:15:32.675 URL being requested: https://www.googleapis.com/upload/mirror/v1/timeline?uploadType=multipart&alt=json
E 2013-08-01 07:15:37.685 The API call urlfetch.Fetch() took too long to respond and was cancelled. Traceback (most recent call last): File "/base/data/home/runtimes/python27

其他一些我得到了这个:

2013-08-01 07:15:11.066 /worker 500 7239ms 0kb AppEngine-Google; (+http://code.google.com/appengine)
I 2013-08-01 07:15:04.434 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-08-01 07:15:04.439 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:04.527 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-08-01 07:15:04.528 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:04.529 URL being requested: https://www.googleapis.com/discovery/v1/apis/mirror/v1/rest?userIp=0.1.0.2
I 2013-08-01 07:15:04.587 URL being requested: https://www.googleapis.com/mirror/v1/timeline?alt=json
I 2013-08-01 07:15:04.620 Refreshing due to a 401
I 2013-08-01 07:15:04.628 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-08-01 07:15:04.629 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:04.630 Refreshing access_token
I 2013-08-01 07:15:04.833 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-08-01 07:15:04.834 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:04.839 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:04.839 get: Got type <class 'model.Credentials'>
I 2013-08-01 07:15:05.970 URL being requested: https://www.googleapis.com/upload/mirror/v1/timeline?uploadType=multipart&alt=json
E 2013-08-01 07:15:10.985 Deadline exceeded while waiting for HTTP response from URL: https://www.googleapis.com/upload/mirror/v1/timeline?uploadType=multipart&alt=json Traceba

目前我有点灰心,因为我可以 100% 理解逻辑,但产品实现很痛苦。

我是否需要使用批量调用才能依次推送卡片? 有不同的方法吗? 为什么当队列进程应该有 10 分钟的截止时间时我会遇到截止时间错误(截止时间错误在执行 10 秒后出现)。

最佳答案

超时实际上来自您的上传请求,您可以通过修改创建服务实例的代码 (util.create_service) 并设置 timeout 参数来解决该问题实例化 httplib2.Http 对象时:

# Instantiate an Http instance
http = httplib2.Http(timeout=2000) # Use a bigger value if you want to stay safe.

关于批处理请求,遗憾的是,API 不支持混合批处理和媒体上传请求...

关于python - 将同一张带有附件的卡推送给我的玻璃器皿的许多用户的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17987406/

相关文章:

google-app-engine - 如果一个用户撤消访问权限,则对多个用户的批量请求会失败

google-mirror-api - 如何直接向我的应用程序发送消息?

google-glass - 编辑 base_css 样式表

python - 将多个参数和可迭代对象传递给 Python 的 multiprocessing.Pool.map

python - 将变量从 python 传递到 mySQL 数据库

Python BeautifulSoup 同一容器中相似的div排序

python - 努力从Python中的csv文件中提取列数据

python - 如何在 Google AppEngine Python37 中获取凭据

java - 来自 Google App Engine 的白标签外发邮件

python - blobstore "Create_upload_url"的 GCS 等效项是什么?