2016-06-23 17 views
6

Possiedo un'applicazione Rails 4 che utilizza l'autenticazione basata su token per le API e deve essere in grado di aggiornare i record tramite lo script Python 3.Come utilizzare le richieste per inviare una richiesta PATCH con le intestazioni

Il mio script attuale assomiglia a questo

import requests 
import json 

url = 'http://0.0.0.0:3000/api/v1/update_experiment.json' 
payload = {'expt_name' : 'A60E001', 'status' : 'done' } 

r = requests.patch(url, payload) 

che funziona bene se disabilitare l'autenticazione API.

Non riesco a capire come aggiungere intestazioni ad esso, requests.patch accetta solo due parametri in base ai documenti.

avrei bisogno di arrivare al punto in cui le seguenti informazioni di intestazione avrebbe aggiunto

'Authorization:Token token="xxxxxxxxxxxxxxxxxxxxxx"' 

Questo tipo di intestazione funziona bene a ricciolo. Come posso farlo in Python 3 e richieste?

+0

hai fatto in realtà * * provare aggiungendo '' headers =? Quello che è successo? – jonrsharpe

+0

Mi sono stancato qualcosa come 'headers = {'Authorization': 'Token', 'token': 'xxxxxx'}' quindi 'r = requests.patch (url, payload, headers = headers)' ma non succede niente, nessun errore in Python, nessuna reazione da WebRick sul lato Rails. Cercando di giocare con i registri per vedere cosa sta succedendo. –

risposta

5

patch prende kwargs, basta passare intestazioni = {} your_header:

def patch(url, data=None, **kwargs): 
    """Sends a PATCH request. 

    :param url: URL for the new :class:`Request` object. 
    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. 
    :param \*\*kwargs: Optional arguments that ``request`` takes. 
    :return: :class:`Response <Response>` object 
    :rtype: requests.Response 
    """ 

    return request('patch', url, data=data, **kwargs) 

Sosomething come:

head = {"Authorization":"Token token=xxxxxxxxxxxxxxxxxxxxxx"} 
url = 'http://0.0.0.0:3000/api/v1/update_experiment.json' 
payload = {'expt_name' : 'A60E001', 'status' : 'done' } 

r = requests.patch(url, payload, headers=head) 
+0

Ciao. Ho provato 'headers = {'Authorization': 'Token', 'token': 'xxxxxx'}' quindi 'r = requests.patch (url, payload, headers = headers)' ma Rails non sembra gradire questo. L'autenticazione fallisce Come posso vedere cosa sta effettivamente inviando Python, come ispezionare l'intestazione. Ho legato 'print (r.headers)' ma questo non include nessuna delle informazioni che ho passato come header. –

+0

@BartC nota che non è proprio il formato delle intestazioni - rileggi l'ultimo snippet di codice. – jonrsharpe

+1

@PadraicCunningham Enormous Thanks !!!!, che ha funzionato alla grande, ha perso quel dettaglio/non l'ho capito e che è stato il colpevole da sempre in molti dei miei altri tentativi di farlo funzionare. Grazie ancora. –

Problemi correlati