как да отстранявате грешки в библиотеката с заявки?

Опитвам се да преобразувам моя скрипт на python от издаване на команда curl чрез os.system() към използване на заявки. Мислех, че ще използвам pycurl, но този въпрос ме убеди в противното. Проблемът е, че получавам грешка, върната от сървъра, която мога да видя, когато използвам r.text (от този отговор), но имам нужда от повече информация. Има ли по-добър начин за отстраняване на грешки в случващото се?

за това, което си струва, мисля, че проблемът се върти около преобразуването на моя флаг --data от curl/pycurl в заявки. Създадох речник на параметрите, които предавах на --data преди. Предполагам, че едно от тях не е валидно, но как мога да получа повече информация, за да знам със сигурност?

пример:

headers2 = {"Accept":"*/*", \
"Content-Type":"application/x-www-form-urlencoded", \
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36", \
"Origin":"https://somedomain.com", \
"X-Requested-With":"XMLHttpRequest", \
"Connection":"keep-alive", \
"Accept-Language":"en-US,en;q=0.8", \
"Referer":"https://somedomain.com/release_cr_new.html?releaseid=%s&v=2&m=a&prev_release_id=%s" % (current_release_id, previous_release_id), \
"Host":"somedomain.com", \
"Accept-Encoding":"gzip,deflate,sdch", \
"Cookie":'cookie_val'}

for bug_id in ids:
  print bug_id
  data = {'dump_json':'1','releaseid':current_release_id, 'v':'2','m':'a','prev_release_id': previous_release_id,'bug_ids': bug_id, 'set_cols':'sqa_status&sqa_updates%5B0%5D%5Bbugid%5D=' + bug_id + '&sqa_updates%5B0%5D%5Bsqa_status%5D=6'}
  print 'current_release_id' , data['releaseid']
  print 'previous_release_id', data['prev_release_id']
  r = requests.post(post_url, data=json.dumps(data), headers=headers2)
  print r.text

Резултатът, който получавам, е доста общо html съобщение, което съм виждал и преди, когато съм запитвал сървъра по грешен начин. Знам, че поне достигам правилния сървър.

Наистина не очаквам никакъв резултат. Това трябва просто да публикува на сървъра и да актуализира поле в DB.


person Ramy    schedule 27.09.2013    source източник
comment
Можете ли да публикувате пример (включително вход, очакван резултат и действителен резултат)? Може да посочите http://httpbin.org/ (можете да разклоните github, ако не искате да изпращате данните си там) . Това може да ви помогне да отстраните разликите.   -  person Wayne Werner    schedule 27.09.2013
comment
Опитах се да го актуализирам с пример. Отначало се колебаех дали да го направя, защото съм пословично лош в оставянето на нещо, което трябва да маскирам.   -  person Ramy    schedule 27.09.2013
comment
Поиграх си малко с кодирането - премахнах го напълно без промяна в резултата.   -  person Ramy    schedule 27.09.2013


Отговори (2)


Анатомия на http отговор

Пример (зарежда се тази страница)

HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Fri, 27 Sep 2013 19:22:41 GMT
Last-Modified: Fri, 27 Sep 2013 19:21:41 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Fri, 27 Sep 2013 19:21:41 GMT
Content-Length: 12706

<!DOCTYPE html>
<html>
... truncated rest of body ...
  1. Първият ред е редът на състоянието и се състои от кода на състоянието и текста на състоянието.
  2. Заглавки са двойки ключ/стойност. Заглавките завършват с празен нов ред. Празният ред означава, че няма повече заглавки и следва началото на полезния товар / тялото.
  3. body поема останалата част от съобщението.

Следното обяснява как да извлечете 3-те части:

Ред на състоянието

Използвайте следното, за да получите реда за състоянието, изпратен обратно от сървъра

>>> bad_r = requests.get('http://httpbin.org/status/404')
>>> bad_r.status_code
404

>>> bad_r.raise_for_status()
Traceback (most recent call last):
  File "requests/models.py", line 832, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error

(източник)

Заглавки:

r = requests.get('http://en.wikipedia.org/wiki/Monty_Python')
# response headers: 
r.headers
# request headers:
r.request.headers

Тяло

Използвайте r.text.

Кодиране на пост заявка

„Content-type“, който изпращате на сървъра в заявката, трябва да съответства на content-type, който всъщност изпращате. Във вашия случай вие изпращате json, но казвате на сървъра, че изпращате данни от формуляр (което е по подразбиране, ако не посочите).

От заглавките, които показвате по-горе:

"Content-Type":"application/x-www-form-urlencoded",

Но вашето повикване request.post задава data=json.dumps(data), което е JSON. Заглавките трябва да казват:

"Content-type": "application/json",

person Jonathan    schedule 27.09.2013
comment
това е страхотно! И така, току-що копирах парчето json.dumps на сляпо. Form-urlencoded е правилният тип кодиране. Промених това на data=data и сега отговорът изглежда по-точен, но не прави точно това, което очаквам. Ще приема този отговор, ровете повече. - person Ramy; 27.09.2013

Стойността, върната от обекта request, съдържа информацията за заявката под .request.

Пример:

r = requests.request("POST", url, ...)

print("Request headers:", r.request.headers)
print("Request body:", r.request.body)

print("Response status code:", r.status_code)
print("Response text:", r.text.encode('utf8'))
person aled    schedule 07.07.2020