все Python 3urllib.requestпонятие
urllib.request.HTTPBasicAuthHandler
аутентификация
Отвечает на 401 с WWW-Authenticate: Basic — повторяет запрос с логином и паролем из менеджера паролей.
Синтаксис
urllib.request.HTTPBasicAuthHandler(password_mgr=None)
Первый запрос всегда уходит без пароля, и только 401 запускает повтор — сервер, отвечающий 403 или 404 вместо 401, пароля не получит (тогда нужен HTTPPasswordMgrWithPriorAuth). Если realm в add_password не совпал с серверным, будет HTTPError 401. Без аргумента он создаёт свой пустой менеджер — пароль тогда добавляют через handler.add_password().
Примеры
import email.message, io, urllib.error, urllib.request, urllib.response
def reply(req, code, body=b'', **headers):
msg = email.message.Message()
for name, value in headers.items():
msg[name.replace('_', '-')] = value
resp = urllib.response.addinfourl(io.BytesIO(body), msg, req.full_url, code)
resp.msg = 'demo'
return resp
class Server(urllib.request.BaseHandler):
handler_order = 100
def http_open(self, req):
auth = req.get_header('Authorization')
print('Authorization:', auth)
if auth:
return reply(req, 200, b'ok')
return reply(req, 401, WWW_Authenticate='Basic realm="api"')
mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
mgr.add_password(None, 'http://example.com/', 'u', 'p')
opener = urllib.request.build_opener(Server, urllib.request.HTTPBasicAuthHandler(mgr))
print(opener.open('http://example.com/secret').read())
# → Authorization: None / Authorization: Basic dTpw / b'ok'
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности