2013-12-11 17 views
9

Sto cercando di modificare alcuni post nel mio blog tumblr utilizzando PyTumblr e edit_post function, ma non riesco a capire esattamente quali parametri sono necessari. Provo a mettere il parametro tags ma non è accettato.Come posso usare la funzione edit_post in PyTumblr?

Ho provato questo:

client = pytumblr.TumblrRestClient(CONSUMER_KEY, CONSUMER_SECRET, 
            OAUTH_TOKEN, OAUTH_TOKEN_SECRET) 
client.edit_post('nameofblog', {'id': 39228373}) 

e mi dà il seguente errore:

TypeError: edit_post() takes exactly 2 arguments (3 given) 

Tutte le idee?

Questa è la funzione:

def edit_post(self, blogname, **kwargs): 
      """ 
    Edits a post with a given id 

    :param blogname: a string, the url of the blog you want to edit 
    :param tags: a list of tags that you want applied to the post 
    :param tweet: a string, the customized tweet that you want 
    :param date: a string, the GMT date and time of the post 
    :param format: a string, sets the format type of the post. html or markdown 
    :param slug: a string, a short text summary to the end of the post url 

    :returns: a dict created from the JSON response 
    """ 
     url = "/v2/blog/%s/post/edit" % blogname 
     return self.send_api_request('post', url, kwargs) 
+0

Esattamente cosa hai provato a passare come parametro (e non ha funzionato)? –

+2

Prima di tutto, non vedo dove metto l'id del post che voglio. – GiannisIordanou

risposta

1

Passaggio di un ID non è ben documentato, così ho chiesto:

client.edit_post("nameofblog", id=39228373, other="details", tags=["are", "cool"]) 

Rif: http://github.com/tumblr/pytumblr/issues/29

+0

Quanto sopra mi dà questo errore: Eccezione: id non sono ammessi campi – GiannisIordanou

+0

@evil_inside Ho aggiornato la mia risposta in base a una risposta dal proprietario. – mikedidthis

3

La biblioteca PyTumblr offre uno strato sottile su il Tumblr REST API e tutti gli argomenti tranne il nome del blog dovrebbero essere passati come argomenti di parole chiave.

Il metodo TumblrRestClient.edit_post(), quindi, funge da proxy per lo /post/edit endpoint e prende tutti gli stessi parametri.

Come tale, si definirebbe le cose come:

client = pytumblr.TumblrRestClient(CONSUMER_KEY, CONSUMER_SECRET, 
           OAUTH_TOKEN, OAUTH_TOKEN_SECRET) 
client.edit_post('nameofblog', id=39228373) 

Questo non vuol dire che se si dispone di un oggetto di dizionario con dettagli postali, non si può fare uso di questo.

Se si volesse impostare il titolo di un determinato posto id, è possibile utilizzare:

post = {'id': 39228373, 'title': 'New title!'} 
client.edit_post('nameofblog', **post) 

Qui il dizionario post viene applicato alla chiamata .edit_post() metodo come argomenti chiave separati utilizzando la sintassi **. Python quindi prende ciascuna coppia chiave-valore nel dizionario di input e applica tale coppia come argomento della parola chiave.

Dovresti essere in grado di impostare uno qualsiasi dei parametri applicabili al tuo tipo di messaggio, elencato sotto posting documentation.

Il problema allora, è che il metodo .edit_post() lascia l'argomento valid_params-self. send_api_request() al default lista vuota, che porta a un'eccezione di convalida garantito per nulla si passa. Questo deve essere un bug, e mi commented on Mike's issue per segnalarlo allo sviluppatore.

+0

Ottenuto il bounty per la spiegazione dettagliata dell'uso di argomenti in una funzione. – GiannisIordanou

+0

Ottima risposta e degna della taglia! Anche imparato qualcosa, che è un bonus. – mikedidthis

+0

@mikedidthis: TBH Mi sento colpevole per aver perso il problema di convalida qui. Ho saltato direttamente su 'if non param' nella funzione di validazione assumendo che ci sarebbe stato un ritorno anticipato per una lista vuota di nomi di parametri validi. –

1

La funzione edit_post accennato, si basa sulla seguente funzione:

def send_api_request(self, method, url, params={}, valid_parameters=[], needs_api_key=False): 
     """ 
Sends the url with parameters to the requested url, validating them 
to make sure that they are what we expect to have passed to us 

:param method: a string, the request method you want to make 
:param params: a dict, the parameters used for the API request 
:param valid_parameters: a list, the list of valid parameters 
:param needs_api_key: a boolean, whether or not your request needs an api key injected 

:returns: a dict parsed from the JSON response 
""" 
     if needs_api_key: 
      params.update({'api_key': self.request.consumer.key}) 
      valid_parameters.append('api_key') 

     files = [] 
     if 'data' in params: 
      if isinstance(params['data'], list): 
       files = [('data['+str(idx)+']', data, open(data, 'rb').read()) for idx, data in enumerate(params['data'])] 
      else: 
       files = [('data', params['data'], open(params['data'], 'rb').read())] 
      del params['data'] 

     validate_params(valid_parameters, params) 
     if method == "get": 
      return self.request.get(url, params) 
     else: 
      return self.request.post(url, params, files) 

Quindi, il problema è che la funzione edit_post nella seguente riga:

return self.send_api_request('post', url, kwargs) 

non fornisce la scelta per la valida opzioni, come fa questa funzione nell'ultima riga:

def reblog(self, blogname, **kwargs): 
     """ 
Creates a reblog on the given blogname 

:param blogname: a string, the url of the blog you want to reblog to 
:param id: an int, the post id that you are reblogging 
:param reblog_key: a string, the reblog key of the post 

:returns: a dict created from the JSON response 
""" 
     url = "/v2/blog/%s/post/reblog" % blogname 

     valid_options = ['id', 'reblog_key', 'comment', 'type', 'state', 'tags', 'tweet', 'date', 'format', 'slug'] 
     if 'tags' in kwargs: 
      # Take a list of tags and make them acceptable for upload 
      kwargs['tags'] = ",".join(kwargs['tags']) 
     return self.send_api_request('post', url, kwargs, valid_options) 

per risolvere il problema, ho modificato la linea di ritorno a:

send_api_request('post', url, {'id':post_id, 'tags':tags}, ['id', 'tags'] 

Ho aggiunto solo i tag che volevo. Dovrebbe funzionare anche con gli altri.

+1

Ah! Ho perso la parte in cui una lista vuota se i parametri validi * ancora * portano ai parametri che vengono convalidati. Questo * deve * essere un bug; Ho un commento sul numero aperto da mike. –