2013-09-18 3 views
6

В следующем коде:AttributeError: «ул» объект имеет не имеет атрибута «элементы»

#!/usr/local/bin/python 
import json 

APPLICATION_NAME = 'cc9226315643df89-36bf02429075329d0ba36748360d050c' 

HEADERS1 = json.dumps(dict(Destination = u"/api/af/latest/applications/%s/rulesets" % (APPLICATION_NAME))) 
print "Headers1 is %s" % (HEADERS1) 
HEADERS2 = {'Destination': '/api/af/latest/applications/%s/rulesets' % (APPLICATION_NAME)} 
print "Headers2 is %s" % (HEADERS2) 

я получаю следующий результат:

Headers1 is {"Destination": "/api/af/latest/applications/cc9226315643df89-36bf02429075329d0ba36748360d050c/rulesets"} 
Headers2 is {'Destination': '/api/af/latest/applications/cc9226315643df89-36bf02429075329d0ba36748360d050c/rulesets'} 

, но когда я пытаюсь использовать либо HEADER1 или HEADER2 в REST вызова с помощью запросов(), я получаю очень разные результаты:

SERVER_URL = 'http://1.1.33.109:8087%s' % (APP_PATH) 
REQ_DATA = None 
print "Headers are: ", HEADERS 
print "SERVER_URL is: ", SERVER_URL 
print "Request Data is:", REQ_DATA 
print "" 

RESPONSE = requests.request(
    'MOVE', 
    SERVER_URL, 
    auth = ('admin', 'admin'), 
    verify = False, 
    data = REQ_DATA, 
    headers = HEADERS1)  #<-- If I use HEADER1 it breaks, if I use HEADER2 it works 
print "Move Ruleset back to the Application RESULT: %s\n" % (RESPONSE) 

я получаю с HEADER1:

Traceback (most recent call last): 
    File "./myrest.py", line 234, in <module> 
    headers = HEADERS1) 
    File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api.py", line 44, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py", line 324, in request 
    prep = req.prepare() 
    File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py", line 223, in prepare 
    p.prepare_headers(self.headers) 
    File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py", line 340, in prepare_headers 
    headers = dict((name.encode('ascii'), value) for name, value in headers.items()) 
AttributeError: 'str' object has no attribute 'items' 

Если я использую HEADER2 он выполняет чисто:

Move Ruleset back to the Application RESULT: Response [200]

Может кто-нибудь объяснить, что эти различия?

+0

Что заставляет вас думать, что строка, кодированная JSON, будет приемлемой в качестве словаря заголовков для запроса HTTP? –

ответ

8

Вы передаете строку ; headers не может быть закодированной в JSON строкой, это всегда словарь Python.

Результаты print обманчивы; Объекты, закодированные JSON, очень похожи на представления словаря Python, но они далеки от от того же самого.

requests API четко говорится, что headers должен быть словарем:

  • headers – (optional) Dictionary of HTTP Headers to send with the Request .

JSON данные то, что вы хотите отправить, как содержание на другой сервер, а не то, что вы хотите использовать для общения с API Python.

+0

я вижу - я проверил с типом() и увидел разницу: Headers1 является { "Destination": "/ апи/аф/последние/приложение/cc9226315643df89-36bf02429075329d0ba36748360d050c/наборами правил"} Headers1 имеет типа: Headers2 является { 'Destination': '/ api/af/latest/applications/cc9226315643df89-36bf02429075329d0ba36748360d050c/rulesets'} Headers2 имеет тип: snrkl

+0

Спасибо за это ... – snrkl

1

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

import requests 
import json 

headerInfo = {'content-type': 'application/json' } 
payload = {'text': 'okay!!!', 'auth_token': 'aasdasdasdasd'} 
jLoad = json.dumps(payload) 

r = requests.post('http://example.com:3030/widgets/init', headers=headerInfo, data=jLoad) 
print r.text 
print r.status_code 
Смежные вопросы