Как проверить код состояния HTTP 401? - PullRequest
0 голосов
/ 14 декабря 2009

В одном из ответов, которые я получил здесь , я столкнулся с проблемой незнания, как автоматически передавать через "Google App Engines" мой идентификатор и пароль на веб-сайт, на котором я нахожусь. зарегистрированный пользователь и есть учетная запись. Мне было предложено «проверить код состояния HTTP 401,« требуется авторизация »и указать тип HTTP-авторизации (базовый, дайджест и т. Д.), Который запрашивает сайт». Я не знаю, как проверить код статуса. Может кто-нибудь, пожалуйста, подскажите как это сделать?

+++++++++++++++++++++++++++++++++

Дополнительная информация:

Если я использую этот способ в Google App Engine (выбирая URL-адрес моей сводной страницы eBay):

from google.appengine.api import urlfetch
url = "http://my.ebay.com/ws/eBayISAPI.dll?MyEbay&gbh=1&CurrentPage=MyeBaySummary&ssPageName=STRK:ME:LNLK"
result = urlfetch.fetch(url)
if result.status_code == 200:
   print "content-type: text/plain"
   print
   print result.status_code

Я всегда получаю «200» вместо «401»

Ответы [ 4 ]

2 голосов
/ 14 декабря 2009

В обычном коде Python, я бы, вероятно, использовал нижний уровень httplib , например ::

import httplib

domains = 'google.com gmail.com appspot.com'.split()

for domain in domains:
  conn = httplib.HTTPConnection(domain)
  conn.request('GET', '/')
  resp = conn.getresponse()
  print 'Code %r from %r' % (resp.status, domain)

это покажет вам такие коды, как 301 (перемещено навсегда) и 302 (перемещено временно); библиотеки более высокого уровня, такие как urllib2, будут обрабатывать такие вещи «за кулисами» для вас, что удобно, но затрудняет простое управление (вы должны установить свои собственные объекты «открытия URL» и т. д.). ).

В App Engine вам, вероятно, лучше использовать urlfetch , который возвращает объект ответа с атрибутом status_code. Если этот атрибут 401, это означает, что вам нужно повторить выборку с соответствующего вида информации авторизации в заголовках.

Однако App Engine теперь также поддерживает urllib2, поэтому, если вам удобно использовать этот более высокий уровень абстракции, вы можете делегировать работу ему. См. здесь для получения руководства о том, как делегировать базовую аутентификацию для urllib2, и здесь для более общего руководства о том, как работает базовая аутентификация (я полагаю, что понимание того, что происходит на нижнем уровне абстракции поможет вам, даже если вы используете верхний слой! -).

1 голос
/ 15 декабря 2009

Вы не получаете 401, потому что этот сайт не возвращает 401, но всегда 200. Обычно тип кода, который мы используем для веб-сайтов, - это возвращение 200 со страницей с надписью «Пожалуйста, войдите в систему… бла-бла», если сайт вернул что-то другое, браузер 200 не будет отображать причудливую ошибку.

Итак, как я уже упоминал в другом вопросе, вам нужно заглянуть на страницу входа в систему, посмотреть, какие параметры она использует, например, login = xxx, password = yyy, опубликовать ее на этой странице, и вам также придется управлять файлами cookie, вот где библиотека, как твил и т. д., входит в картину.

1 голос
/ 15 декабря 2009

Большинство сайтов, ориентированных на пользователя, не используют HTTP-аутентификацию, предпочитая вместо этого использовать аутентификацию на основе файлов cookie с HTML-формами для входа. Если вы хотите продублировать это в своем собственном коде, вам нужно сделать HTTP-запрос POST на URL-адрес входа в систему для рассматриваемого приложения и захватить отправленный обратно файл cookie, в том числе во всех ваших будущих запросах на аутентификацию. Без более подробной информации о конкретном сайте, с которым вы пытаетесь пройти аутентификацию, сложно быть более конкретным.

1 голос
/ 14 декабря 2009

Если я не до конца понимаю ваш вопрос, вы можете получить код возврата из объекта ответа , используя свойство status_code.

Сначала вам нужно будет выполнить fetch () для URL, который вы хотите проверить.

...