2011-05-02 95 views
2

我在尝试发布推文时从AppEngine收到此错误。我在想我的语法不太对,但我现在很茫然。Python问题:AttributeError:'字典'对象没有'upper'属性

对我的生活中,我似乎无法使用我的状态参数发送给在后功能** extra_params:

args = {} <br/> 
args.update({'status': 'THIS IS MY TWEET'})<br/> 
info2 = client.post('/statuses/update',args)<br/> 

精确的错误是:

"File "/base/data/home/apps/kymbatweet/1.350119792863170339/main.py", line 311, in get_signed_body 
    __meth.upper(), __url, '&'.join(
AttributeError: 'dict' object has no attribute 'upper'" 

任何想法? (代码如下)

def post(self, api_method, http_method='POST', expected_status=(200,), **extra_params): 

     if not (api_method.startswith('http://') or api_method.startswith('https://')): 
      api_method = '%s%s%s' % (
       self.service_info['default_api_prefix'], api_method, 
       self.service_info['default_api_suffix'] 
       ) 

     if self.token is None: 
      #self.token = OAuthAccessToken.get_by_key_name(self.get_cookie()) 
      self.token = "000" 



     fetch = urlfetch(url=api_method, payload=self.get_signed_body(
      api_method, "000", http_method, **extra_params 
      ), method=http_method) 

     if fetch.status_code not in expected_status: 
      raise ValueError(
       "Error calling... Got return status: %i [%r]" % 
       (fetch.status_code, fetch.content) 
       ) 

     return decode_json(fetch.content) 



    def get_signed_body(self, __url, __token=None, __meth='GET',**extra_params): 

     service_info = self.service_info 

     kwargs = { 
      'oauth_consumer_key': service_info['consumer_key'], 
      'oauth_signature_method': 'HMAC-SHA1', 
      'oauth_version': '1.0', 
      'oauth_timestamp': int(time()), 
      'oauth_nonce': getrandbits(64), 
      } 

     kwargs.update(**extra_params) 
     #This works if hardcoded 
     #kwargs.update({'status': 'AE'}) 

     if self.service_key is None: 
      self.service_key = get_service_key(self.service) 

     if __token is not None: 
      kwargs['oauth_token'] = "000" 
      key = self.service_key + encode("6iD2LYnUfEOYl0zOCj5IKawbok3pjs4yixay5bdM") 
     else: 
      key = self.service_key 
     #Code BOMBS HERE 
     message = '&'.join(map(encode, [ 
      __meth.upper(), __url, '&'.join(
       '%s=%s' % (encode(k), encode(kwargs[k])) for k in sorted(kwargs) 
       ) 
      ])) 

     kwargs['oauth_signature'] = hmac(
      key, message, sha1 
      ).digest().encode('base64')[:-1] 

     return urlencode(kwargs) 



class MainHandler(RequestHandler): 
    """Demo Twitter App.""" 

    def get(self): 

     client = OAuthClient('twitter', self) 

     client.token = "000" 


     args = {} 
     args.update({'status': 'THIS IS MY TWEET'}) 

     info2 = client.post('/statuses/update',args) 

回答

5

你不把它当作extra_params,你把它当作http_method

info2 = client.post('/statuses/update', **args) 
1

如果你想从字典中通过额外PARAMATERS(关键字参数),你需要这样称呼它:

client.post('/path', **args) 
相关问题