From 0df0d28c2f026f3c9484c1b7db39d5eb7cbddd09 Mon Sep 17 00:00:00 2001 From: Susheng Date: Thu, 9 Jul 2015 23:03:26 +0100 Subject: [PATCH] Re-fetch access_token when it is out of date. Fix some syntax mistakes. --- wechat/models.py | 4 ++-- wechat/official.py | 38 +++++++++++++++++++++++--------------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/wechat/models.py b/wechat/models.py index b55e0d7..d2a2491 100644 --- a/wechat/models.py +++ b/wechat/models.py @@ -111,10 +111,10 @@ class WxCompoundResponse(WxResponse): def __init__(self, data, request): super(WxCompoundResponse, self).__init__(request) - self.data + self.data = data def content_nodes(self, doc): - return self.fields2elements(self.data, self.Tag, doc) + return fields2elements(self.data, self.Tag, doc) class WxImageResponse(WxCompoundResponse): diff --git a/wechat/official.py b/wechat/official.py index a1f4458..11d862d 100644 --- a/wechat/official.py +++ b/wechat/official.py @@ -207,7 +207,8 @@ def access_token(self): return None return self._access_token - def set_access_token(self, token): + @access_token.setter + def access_token(self, token): self._access_token = token def _process_response(self, rsp): @@ -279,25 +280,32 @@ def download_media(self, media_id, to_path, url='media/get'): else: return None, APIError(rsp.status_code, 'http error') - def _get_media_id(self, obj, resource, content_type): - if not obj.get(resource + '_id'): - rsp, err = None, None - if obj.get(resource + '_content'): - rsp, err = self.upload_media( - content_type, - file_content=obj.get(resource + '_content')) - if err: - return None - elif obj.get(resource + '_url'): - rs = requests.get(obj.get(resource + '_url')) + def _upload_media(self, obj, resource, content_type, path_type): + rsp, err = None, None + resource_path = resource + '_' + path_type + if obj.get(resource_path): + rsp, err = self.upload_media( + content_type, + file_content=obj.get(resource_path)) + if err: + # access_token有效期为3小时,可能因为失效而导致上传失败,在这里重新获取一次 + self.access_token = None rsp, err = self.upload_media( content_type, - file_content=rs.content) + file_path=obj.get(resource_path)) if err: return None - else: - return None return rsp['media_id'] + return None + + def _get_media_id(self, obj, resource, content_type): + if not obj.get(resource + '_id'): + mid = None + for path_type in ['content', 'url', 'path']: + mid = self._upload_media(obj, resource, content_type, path_type) + if mid: + return mid + return mid return obj.get(resource + '_id')