2013-09-09 3 views
0

Различные вопросы re: 1 скрипт. Я должен использовать JSON-ify из сценария Python, который будет работать на стороне клиента и делать POST на удаленном URL-адресе. Я следую документам здесь http://docs.python.org/2/library/httplib.html - Однако я не уверен, что я делаю это правильно. Я не получаю никакого статуса ответа, когда я запускаю его на своем Mac. Прямо сейчас, я сомневаюсь в следующем:Python JSON POST запрос

(1) The dummy 'device_key' (of the client) 
(2) The IP, Port listed at HTTPConnection --- I don't want to hard-code the IP, Port - should I be using "ServerHost:Port" 
(3) The cpuStats is a nametuple (of 'user'= somevalue, 'idle' = somevalue, etc.) that is converted to a dict by _asdict(). I want to just send the cpuStats (namedtuple) to the URLpage. 
(4) The cpu_times_percent(percpu=True) is what the docs say <http://code.google.com/p/psutil/wiki/Documentation#CPU> but when I run the script on my Mac - it shows just 1 namedtuple of cpu percentages though my mac has 4 cpus. 

У меня есть сильное ощущение, что мои ошибки выходят за пределы этого списка.

Заранее спасибо.

import psutil 
import socket 
import time 
import sample 
import json 
import httplib 
import urllib 



serverHost = sample.host 
port = sample.port 

thisClient = socket.gethostname() 
cpuStats = psutil.cpu_times_percent(percpu=True) 
print cpuStats 


currentTime = int(time.time()) 
s = socket.socket() 
s.connect((serverHost,port)) 



cpuStatsjson = json.dumps(cpuStats._asdict()) 
params = urllib.urlencode({'cpuStats': cpuStats, 'device_key': 12345}) 
headers = {"Content-type": "application/json", "Accept": "text/plain"} 
conn = httplib.HTTPConnection("http://XXX.XXX.XXX.XXX:YYYY") 
conn.request("POST", "", cpuStatsjson, headers) 
response = conn.getresponse() 
print response.status, response.reason 

s.close() 

ответ

3

Да, HTTPLIB может сделать это возможно, но я бы настоятельно предложить что-то вроде requests

на этот вопрос, чтобы работать в запросах

import requests 

def post_some_dict(dict): 
    headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} 
    r = requests.post(url, data=json.dumps(dict), headers=headers) 

как для вашего кода, подключение сокета не требуется Я предполагаю, и следующий код действительно для меня:

data = {"somekey": 12} 
headers = {"Content-type": "application/json", "Accept": "text/plain"} 
conn = httplib.HTTPConnection('xx.xx.xx.xx') 
conn.request("POST", "/", json.dumps(data), headers) 
+1

irement должен избегать сторонних библиотек, и поэтому я использую urllib, httplib. – user2480526

+0

Обратите внимание, что 'запросы' теперь принимает прямое кодирование Python для кодирования напрямую (используя' json = dict' здесь, не нужно использовать 'json.dumps()', для вас также установлен правильный заголовок Content-Type. Кроме того, не используйте 'dict' в качестве имени переменной, вы затеняете встроенный тип. –

+0

Да, тень не слишком хороша, я должен согласиться. Я не знал, что запросы теперь принимают dicts как структуры JSON, очень приятно! – windwarrior

 Смежные вопросы

  • Нет связанных вопросов^_^