Оглавление
Введение
Для тех, кто знаком с написанием традиционного кода Python, переход к асинхронному коду может быть концептуально немного сложным. Асинхронный код полагается на сопрограммы, которые в сочетании с циклом событий позволяют писать код, который может казаться выполняющим более одного действия одновременно.
Сопрограммы можно рассматривать как функции, у которых есть точки в коде, где они возвращают управление программой вызывающему контексту. Эти точки «доходности» позволяют приостанавливать и возобновлять выполнение сопрограмм в дополнение к обмену данными между контекстами.
Цикл событий решает, какой фрагмент кода запускается в любой момент – он отвечает за приостановку, возобновление и обмен данными между сопрограммами. Это означает, что части разных сопрограмм могут в конечном итоге выполняться в порядке, отличном от того, в котором они были запланированы. Идея выполнения различных фрагментов кода в произвольном порядке называется параллелизмом.
Размышление о параллелизме в контексте выполнения HTTP-запросов может прояснить ситуацию. Представьте, что вы хотите сделать много независимых запросов к серверу. Например, мы можем запросить веб-сайт, чтобы получить статистику обо всех спортивных игроках в данном сезоне.
Мы можем делать каждый запрос последовательно. Однако с каждым запросом мы можем представить, что наш код может некоторое время ждать, пока запрос будет доставлен на сервер, а ответ будет отправлен обратно.
Иногда эти операции могут длиться даже несколько секунд. Приложение может испытывать сетевую задержку из-за большого количества пользователей или просто из-за ограничений скорости данного сервера.
Что, если бы наш код мог делать другие вещи, ожидая ответа от сервера? Более того, что, если он вернется к обработке данного запроса только после получения данных ответа? Мы могли бы сделать много запросов в быстрой последовательности, если бы нам не приходилось ждать завершения каждого отдельного запроса, прежде чем переходить к следующему в списке.
Сопрограммы с циклом событий позволяют нам писать код, который ведет себя именно таким образом.
urllib¶
См.также
- Лекции Р. Сузи
- https://docs.python.org/3/library/urllib.request.html
- https://docs.python.org/3/howto/urllib2.html
import urllib.request doc = urllib.request.urlopen("http://lectureswww.readthedocs.org") print(doc.read())
<!DOCTYPE html> <!--><html class="no-js lt-ie9" lang="en" > <!--> <!--><!--> <html class="no-js" lang="en" > <!--<!--> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Основы Веб-программирования — Документ
Функция создает файлоподобный объект,
который читается методом .
Другие методы этого объекта:
,
,
,
,
работают как и у обычного файла, а также есть метод
, который возвращает
соответствующий полученному с сервера Message-объект.
Его можно использовать для получения дополнительной информации:
import urllib.request doc = urllib.request.urlopen("http://lectureswww.readthedocs.org") print(doc.info())
Server nginx1.4.6 (Ubuntu) X-Deity chimera-lts Vary Accept-Encoding X-Served Nginx Content-Type texthtml Date Thu, 05 Feb 2015 133041 GMT Accept-Ranges bytes ETag "54c74bc0-62a2" Connection close X-Subdomain-TryFiles True Last-Modified Tue, 27 Jan 2015 082640 GMT Content-Length 25250
С помощью функции можно делать и более
сложные вещи, например, передавать web-серверу данные формы. Как
известно, данные заполненной web-формы могут быть переданы на
web-сервер с использованием метода GET или метода POST. Метод GET
связан с кодированием всех передаваемых параметров после знака «?» в
URL, а при методе POST данные передаются в теле HTTP-запроса.
Оба варианта передачи представлены ниже:
import urllib.request import urllib.parse data = {"s" "Веб программирование"} enc_data = urllib.parse.urlencode(data) # GET запрос f = urllib.request.urlopen("http://nigma.ru/" + "?" + enc_data) print(f.read()) # POST запрос f = urllib.request.urlopen("http://nigma.ru/", enc_data.encode('utf-8')) print(f.read())
В некоторых случаях данные имеют повторяющиеся имена. В этом случае в качестве
параметра можно использовать вместо словаря
последовательность пар имя-значение:
import urllib.parse data = [("n", "1"), ("n", "3"), ("n", "4"), ("button", "Привет"), enc_data = urllib.parse.urlencode(data) print(enc_data)
n=1&n=3&n=4&button=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82
Модуль позволяет загружать web-объекты через
прокси-сервер. Если ничего не указывать, будет использоваться прокси-сервер,
который был задан принятым в конкретной ОС способом. В Unix прокси-серверы
задаются в переменных окружения , и т.п., в Windows
прокси-серверы записаны в реестре, а в Mac OS они берутся из конфигурации
Internet. Задать прокси-сервер можно через
:
Redirect with nginx
In the next example, we show how to set up a page redirect in nginx server.
location = /oldpage.html { return 301 /newpage.html; }
Add these lines to the nginx configuration file, which is located at
on Debian.
$ sudo service nginx restart
After the file has been edited, we must restart nginx to apply the
changes.
oldpage.html
<!DOCTYPE html> <html> <head> <title>Old page</title> </head> <body> <p> This is old page </p> </body> </html>
This is the file located in the nginx document root.
newpage.html
<!DOCTYPE html> <html> <head> <title>New page</title> </head> <body> <p> This is a new page </p> </body> </html>
This is the .
redirect3.py
#!/usr/bin/env python3 import requests as req resp = req.get("http://localhost/oldpage.html") print(resp.status_code) print(resp.history) print(resp.url) print(resp.text)
This script accesses the old page and follows the redirect. As we already mentioned,
Requests follows redirects by default.
$ ./redirect3.py 200 (<Response >,) http://localhost/files/newpage.html <!DOCTYPE html> <html> <head> <title>New page</title> </head> <body> <p> This is a new page </p> </body> </html>
This is the output of the example.
$ sudo tail -2 /var/log/nginx/access.log 127.0.0.1 - - [21/Jul/2019:07:41:27 -0400] "GET /oldpage.html HTTP/1.1" 301 184 "-" "python-requests/2.4.3 CPython/3.4.2 Linux/3.16.0-4-amd64" 127.0.0.1 - - [21/Jul/2019:07:41:27 -0400] "GET /newpage.html HTTP/1.1" 200 109 "-" "python-requests/2.4.3 CPython/3.4.2 Linux/3.16.0-4-amd64"
As we can see from the file, the request was redirected
to a new file name. The communication consisted of two GET requests.
Аутентификация
Аутенфикация помогает сервисам понять кто вы. Как правило, вы предоставляете свои учетные данные на сервер, передавая данные через заголовок авторизации или пользовательский заголовок, определенный службой.
Все функции запроса, которые вы видели до этого момента, предоставляют параметр , который позволяет передавать вам свои учетные данные.
Одним из примеров API, которые требует аутентификации, является GitHub’s Authenticated User API. Это конечная точка предоставляет информацию о профиле аутентифицированного пользователя. Чтобы сделать запрос к Authenticated User API, вы можете передать свое имя пользователя и пароль в кортеже :
Запрос будет успешно выполнен, если учетные данные, которые вы передали в кортеже верны. Если вы попробуете сделать запрос не указав учетные данные, то получите в ответ от сервера код состояния .
Когда вы передаете имя пользователя и пароль в кортеже параметру , применяет учетные данные с использованием базовой схемы аутентификации доступа HTTP.
Таким образом, вы можете сделать тот же запрос, передав учетные данные, используя :
Вам не обязательно использовать , вы можете аутентифицироваться и другим способом. из коробки предоставляют и другие методы аутентификации, такие как и .
Вы даже можете использовать свой собственный механизм аутентификации. Для этого, вы должны создать подкласс , затем внедрить :
Здесь ваш пользовательский механизм получает токен, а затем включает этот токен в заголовок вашего запроса.
Плохие механизмы проверки подлинности могут привести к уязвимостям в безопасности. Поэтому, если вашему сервису, по какой-либо причине не требуется настраиваемый механизм проверки подлинности, то лучше использовать готовые схемы проверки подлинности, такие как или .
Пока вы думаете о безопасности, давайте рассмотрим работу с SSL-сертификатами в библиотеке .
User agent
In this section, we specify the name of the user agent. We create our
own Python HTTP server.
http_server.py
#!/usr/bin/env python3 from http.server import BaseHTTPRequestHandler, HTTPServer class MyHandler(BaseHTTPRequestHandler): def do_GET(self): message = "Hello there" self.send_response(200) if self.path == '/agent': message = self.headers self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write(bytes(message, "utf8")) return def main(): print('starting server on port 8081...') server_address = ('127.0.0.1', 8081) httpd = HTTPServer(server_address, MyHandler) httpd.serve_forever() main()
We have a simple Python HTTP server.
if self.path == '/agent': message = self.headers
If the path contains , we return
the specified user agent.
user_agent.py
#!/usr/bin/env python3 import requests as req headers = {'user-agent': 'Python script'} resp = req.get("http://localhost:8081/agent", headers=headers) print(resp.text)
This script creates a simple GET request to our Python HTTP server.
To add HTTP headers to a request, we pass in a dictionary to the
parameter.
headers = {'user-agent': 'Python script'}
The header values are placed in a Python dictionary.
resp = req.get("http://localhost:8081/agent", headers=headers)
The values are passed to the parameter.
$ simple_server.py starting server on port 8081...
First, we start the server.
$ ./user_agent.py Python script
Then we run the script. The server responded with the name of the agent that we
have sent with the request.
Использование запросов в Python
Чтобы понять, как работает модуль запросов, нам нужно знать основы того, что происходит, когда мы просматриваем веб-страницы, и как он мгновенно показывает вам контент, который вы надеялись увидеть.
Каждый раз, когда вы нажимаете на ссылку, мы отправляем HTTP (протокол передачи гипертекста) запрос на сервер страницы запросов.
Получив запрос, сервер отправляет нам обратно нужный контент, который мы у него запросили. Два самых полезных HTTP-запроса, которые мы собираемся изучить, – это запросы GET и POST.
В следующем разделе мы узнаем, как использовать эти методы с библиотекой запросов. Но сначала нам нужно импортировать его в ваш скрипт или интерпретатор.
import requests
1. ПОЛУЧИТЬ запрос
Этот метод используется для указания на то, что мы запрашиваем содержимое выбранного нами URL-адреса с сервера. Итак, допустим, мы хотим получить домашнюю страницу Google, используя наши HTTP-запросы.
Введите следующую строку.
r = requests.get("http://google.com")
Вот что делает одна строка кода: он отправляет запрос HTTP GET на домашнюю страницу Google с помощью метода get (), где URL-адрес указан в качестве аргумента. И объект ответа хранится в нашей переменной ‘r’.
Экземпляр нашего объекта ответа дополнительно классифицирует сохраненные данные и сохраняет их в соответствующих атрибутах. Вот пример ниже
print(r.status_code) #The output provides the status code for the url. For a success full attempt, the result is 200 print(r.headers) #The following attribute returns a python dictionary containing key-value pair of the headers print(r.text) #This command prints out the response content from the server or Static Source Code. print(r.encoding) r.encoding = 'utf-8' #Requests library also allows you to see or change the encoding of the response content.
2. Передача параметров с помощью метода GET
Часто один метод GET не позволяет нам найти всю информацию, к которой нам нужен доступ, поэтому нам нужно передать дополнительные параметры с нашим исходным запросом get.
Параметры в основном представляют собой пары ключ-значение данных, заключенных в кортеж или список . Мы можем отправить его, используя параметр params нашего метода get ().
См.Синтаксис, чтобы следовать дальше.
import requests payload = {'key1': 'value1', 'key2': 'value2'} r = requests.get('http://httpbin.org/get', params=payload) print(r.text)
Выход:
{ "args": { "key1": "value1", "key2": "value2" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.22.0", "X-Amzn-Trace-Id": "Root=1-5f9a64d1-2abfc74b2725386140a897e3" }, "origin": 0.0.0.0, "url": "http://httpbin.org/get?key1=value1&key2=value2" }
3. Запрос на публикацию
В отличие от запросов GET в Python, метод POST в HTTP требует, чтобы с ним была размещена полезная нагрузка. Этот метод используется для отправки данных на сервер, а не для их непосредственного извлечения. В нашей библиотеке запросов мы можем получить доступ к POST с помощью метода post ().
Взгляните на синтаксис:
import requests payload = {'key1': 'value1', 'key2': 'value2'} r = requests.post("https://httpbin.org/post", data=payload) print(r.text)
Выход:
{ "args": {}, "data": "", "files": {}, "form": { "key1": "value1", "key2": "value2" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "23", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.22.0", "X-Amzn-Trace-Id": "Root=1-5f9a6726-276da087230912e01dd5dcd7" }, "json": null, "origin": , "url": "https://httpbin.org/post" }
Объект сеанса
Объект сеанса в основном используется для сохранения определенных параметров, например файлов cookie, в различных HTTP-запросах. Объект сеанса может использовать одно TCP-соединение для обработки нескольких сетевых запросов и ответов, что приводит к повышению производительности.
import requests first_session = requests.Session() second_session = requests.Session() first_session.get('http://httpbin.org/cookies/set/cookieone/111') r = first_session.get('http://httpbin.org/cookies') print(r.text) second_session.get('http://httpbin.org/cookies/set/cookietwo/222') r = second_session.get('http://httpbin.org/cookies') print(r.text) r = first_session.get('http://httpbin.org/anything') print(r.text)
Вывод:
{"cookies":{"cookieone":"111"}} {"cookies":{"cookietwo":"222"}} {"args":{},"data":"","files":{},"form":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Cookie":"cookieone=111","Host":"httpbin.org","User-Agent":"python-requests/2.9.1"},"json":null,"method":"GET","origin":"103.9.74.222","url":"http://httpbin.org/anything"}
Путь httpbin/cookies/set /{имя}/{значение} установит файл cookie с именем и значением. Здесь мы устанавливаем разные значения cookie для объектов first_session и second_session. Вы можете видеть, что один и тот же файл cookie возвращается во всех будущих сетевых запросах для определенного сеанса.
Точно так же мы можем использовать объект сеанса для сохранения определенных параметров для всех запросов.
import requests first_session = requests.Session() first_session.cookies.update({'default_cookie': 'default'}) r = first_session.get('http://httpbin.org/cookies', cookies={'first-cookie': '111'}) print(r.text) r = first_session.get('http://httpbin.org/cookies') print(r.text)
Вывод:
{"cookies":{"default_cookie":"default","first-cookie":"111"}} {"cookies":{"default_cookie":"default"}}
Как видите, default_cookie отправляется с каждым запросом сеанса. Если мы добавим какой-либо дополнительный параметр к объекту cookie, он добавится к файлу default_cookie. «first-cookie»: «111» добавляется к cookie по умолчанию «default_cookie»:»default».
Как послать Multipart-Encoded файл
Requests позволяет легко послать на сервер Multipart-Encoded файлы:
>>> url = 'http://httpbin.org/post' >>> files = {'file': open('report.xls', 'rb')} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "<censored...binary...data>" }, ... }
Вы можете установить имя файла, content-type и заголовки в явном виде:
>>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "<censored...binary...data>" }, ... }
При желании, вы можете отправить строки, которые будут приняты в виде файлов:
>>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "some,data,to,send\nanother,row,to,send\n" }, ... }
В случае, если вы отправляете очень большой файл как , вы можете захотеть отправить запрос потоком. По умолчанию не поддерживает этого, но есть отдельный пакет, который это делает — .
Для отправки нескольких файлов в одном запросе, обратитесь к дополнительной документации.
6: Использование Translate API
Теперь давайте попробуем использовать Yandex Translate API для выполнения запроса на перевод текста на другой язык.
Чтобы использовать API, сначала необходимо зарегистрироваться. После регистрации перейдите в Translate API и создайте ключ API. Получив ключ, добавьте его в свой файл script.py как константу.
Вот ссылка, по которой можно все сделать.
Ключ API нужен нам потому, что с его помощью Яндекс сможет аутентифицировать нас каждый раз, когда мы хотим использовать его API. Ключ API представляет собой упрощенную форму аутентификации, он добавляется в конец URL-адреса запроса при отправке.
Узнать, какой URL нужно отправить, чтобы использовать API, можно в документации Яндекса.
Там можно найти всю информацию, необходимую для использования Translate API для перевода текста.
Если в URL вы видите амперсанды (&), вопросительные знаки (?) и знаки равенства (=), вы можете быть уверены, что такой URL предназначен для запросов GET. Эти символы задают соответствующие параметры URL-адреса.
Обычно в квадратных скобках ([]) указываются опциональные фрагменты. В этом случае таковыми являются format, options и callback, в то время как key, text, and lang обязательно должны присутствовать в запросе.
Давайте добавим код для отправки запроса на этот URL. Вы можете заменить первый созданный нами запрос в файле script.py следующим кодом:
Есть два способа добавить параметры. Их можно добавить в конец URL-адреса напрямую, а можно сделать так, чтобы запросы делали это за нас. Чтобы сделать последнее, мы можем создать словарь для наших параметров. Обязательными элементами будут ключ, текст и язык. Давайте создадим словарь, используя ключ API, текст ‘Hello’ и языки ‘en-es’ (то есть текст нужно перевести с английского на испанский).
Другие языковые коды вы можете найти здесь в столбце 639-1.
Давайте создадим словарь параметров, используя функцию dict(), и передадим ей ключи и значения, которые должны быть в этом словаре. Добавьте в файл script.py:
Теперь мы возьмем словарь параметров и передадим его в функцию .get().
После этого запросы начнут добавляться к URL-адресу самостоятельно.
Теперь давайте добавим оператор print для текста ответа и посмотрим, что вернется в результате.
Здесь мы видим три вещи. Сначала идет код состояния, который в точности совпадает с кодом состояния самого ответа; затем идет язык, который мы выбрали; в конце мы видим переведенный текст.
Попробуйте еще раз, указав в качестве языка en-fr, и вы должны увидеть «Bonjour» в ответе.
Давайте посмотрим на заголовки для этого конкретного ответа.
Очевидно, заголовки будут отличаться, потому что мы обращаемся к другому серверу. В этом случае тип контента – application/json, а не text/html. Это означает, что данные могут быть интерпретированы как JSON.
Когда application/json является типом контента, мы можем сделать так, чтобы запросы преобразовывали ответ в словарь и список, чтобы легче получать доступ к данным.
Чтобы данные были обработаны как JSON, мы используем метод .json() для объекта ответа.
Если вы отобразите его, вы увидите, что данные выглядят так же, но формат немного отличается.
Теперь это не простой текст, который вы получаете из res.text, а версия словаря.
Допустим, мы хотим получить доступ к тексту. Поскольку теперь это словарь, мы можем использовать ключ text.
И теперь мы увидим только данные для этого ключа. В этом случае мы получим список из одного элемента. Если вам нужно получить этот текст в списке, можно получить к нему доступ по индексу.
И теперь на экране будет только переведенное слово.
Меняя параметры, вы будете получать разные результаты. Давайте изменим текст, вместо Hello будет Goodbye, а также изменим целевой язык на испанский и отправим запрос снова.
Также можно попробовать перевести более длинный текст на другие языки и посмотреть, какие ответы дает API.
Parameter Values
Parameter | Description | |
---|---|---|
url | Try it | Required. The url of the request |
data | Try it | Optional. A dictionary, list of tuples, bytes or a file object to send to the specified url |
json | Try it | Optional. A JSON object to send to the specified url |
files | Try it | Optional. A dictionary of files to send to the specified url |
allow_redirects | Try it | Optional. A Boolean to enable/disable redirection.Default (allowing redirects) |
auth | Try it | Optional. A tuple to enable a certain HTTP authentication.Default |
cert | Try it | Optional. A String or Tuple specifying a cert file or key.Default |
cookies | Try it | Optional. A dictionary of cookies to send to the specified url.Default |
headers | Try it | Optional. A dictionary of HTTP headers to send to the specified url.Default |
proxies | Try it | Optional. A dictionary of the protocol to the proxy url.Default |
stream | Try it | Optional. A Boolean indication if the response should be immediately downloaded (False) or streamed (True).Default |
timeout | Try it | Optional. A number, or a tuple, indicating how many seconds to wait for the client to make a connection and/or send a response.Default which means the request will continue until the connection is closed |
verify |
Try it Try it |
Optional. A Boolean or a String indication to verify the servers TLS certificate or not.Default |
HTML Sessions¶
These sessions are for making HTTP requests:
- class (mock_browser=True)
-
A consumable session, for cookie persistence and connection pooling,
amongst other things.- ()
-
If a browser was created close it first.
- (url, **kwargs)
-
Sends a DELETE request. Returns object.
Parameters: - url – URL for the new object.
- **kwargs – Optional arguments that takes.
Return type: requests.Response
- (url, **kwargs)
-
Sends a GET request. Returns object.
Parameters: - url – URL for the new object.
- **kwargs – Optional arguments that takes.
Return type: requests.Response
- (url)
-
Returns the appropriate connection adapter for the given URL.
Return type: requests.adapters.BaseAdapter
- (resp)
-
Receives a Response. Returns a redirect URI or
- (url, **kwargs)
-
Sends a HEAD request. Returns object.
Parameters: - url – URL for the new object.
- **kwargs – Optional arguments that takes.
Return type: requests.Response
- (url, proxies, stream, verify, cert)
-
Check the environment and merge it with some settings.
Return type:
- (prefix, adapter)
-
Registers a connection adapter to a prefix.
Adapters are sorted in descending order by prefix length.
- (url, **kwargs)
-
Sends a OPTIONS request. Returns object.
Parameters: - url – URL for the new object.
- **kwargs – Optional arguments that takes.
Return type: requests.Response
- (url, data=None, **kwargs)
-
Sends a PATCH request. Returns object.
Parameters: - url – URL for the new object.
- data – (optional) Dictionary, bytes, or file-like object to send in the body of the .
- **kwargs – Optional arguments that takes.
Return type: requests.Response
- (url, data=None, json=None, **kwargs)
-
Sends a POST request. Returns object.
Parameters: - url – URL for the new object.
- data – (optional) Dictionary, bytes, or file-like object to send in the body of the .
- json – (optional) json to send in the body of the .
- **kwargs – Optional arguments that takes.
Return type: requests.Response
- (request)
-
Constructs a for
transmission and returns it. The has settings
merged from the instance and those of the
.Parameters: request – instance to prepare with this
session’s settings.Return type: requests.PreparedRequest
- (url, data=None, **kwargs)
-
Sends a PUT request. Returns object.
Parameters: - url – URL for the new object.
- data – (optional) Dictionary, bytes, or file-like object to send in the body of the .
- **kwargs – Optional arguments that takes.
Return type: requests.Response
- (prepared_request, response)
-
When being redirected we may want to strip authentication from the
request to avoid leaking credentials. This method intelligently removes
and reapplies authentication where possible to avoid credential loss.
- (prepared_request, response)
-
When being redirected we may want to change the method of the request
based on certain specs or browser behavior.
- (prepared_request, proxies)
-
This method re-evaluates the proxy configuration by considering the
environment variables. If we are redirected to a URL covered by
NO_PROXY, we strip the proxy configuration. Otherwise, we set missing
proxy keys for this URL (in case they were stripped by a previous
redirect).This method also replaces the Proxy-Authorization header where
necessary.Return type:
- (*args, **kwargs) → requests_html.HTMLResponse
-
Makes an HTTP Request, with mocked User–Agent headers.
Returns a class:HTTPResponse <HTTPResponse>.
- (resp, req, stream=False, timeout=None, verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs)
-
Receives a Response. Returns a generator of Responses or Requests.
- (request, **kwargs)
-
Send a given PreparedRequest.
Return type: requests.Response
Authentication
Authentication helps a service understand who you are. Typically, you provide your credentials to a server by passing data through the header or a custom header defined by the service. All the request functions you’ve seen to this point provide a parameter called , which allows you to pass your credentials.
One example of an API that requires authentication is GitHub’s API. This endpoint provides information about the authenticated user’s profile. To make a request to the Authenticated User API, you can pass your GitHub username and password in a tuple to :
>>>
The request succeeded if the credentials you passed in the tuple to are valid. If you try to make this request with no credentials, you’ll see that the status code is :
>>>
When you pass your username and password in a tuple to the parameter, is applying the credentials using HTTP’s Basic access authentication scheme under the hood.
Therefore, you could make the same request by passing explicit Basic authentication credentials using :
>>>
Though you don’t need to be explicit for Basic authentication, you may want to authenticate using another method. provides other methods of authentication out of the box such as and .
You can even supply your own authentication mechanism. To do so, you must first create a subclass of . Then, you implement :
Here, your custom mechanism receives a token, then includes that token in the header of your request.
Bad authentication mechanisms can lead to security vulnerabilities, so unless a service requires a custom authentication mechanism for some reason, you’ll always want to use a tried-and-true auth scheme like Basic or OAuth.
While you’re thinking about security, let’s consider dealing with SSL Certificates using .
Подключаем VS Code
Мы уже рассказывали об этом редакторе кода — он быстрый, бесплатный и есть много плагинов. Чтобы работать с Python-файлами было проще, научим VS Code понимать и запускать их. Для этого нам нужно найти и установить специальный плагин для этого языка. Открываем вкладку Расширения (Extensions) и пишем такое:
В результатах поиска находим Python и нажимаем Install:
Затем то же самое делаем для подсветки синтаксиса: пишем в Расширениях команду и устанавливаем плагин MagicPython. После этого перезапускаем VS Code, открываем наш файл и нажимаем F5. Когда выпадающее окошко спросит, с чем будем работать — выбираем Python. В итоге мы получаем редактор кода с нужной нам подсветкой синтаксиса и результатом работы в том же окне. Красота!
Запускаем и отлаживаем программу на Python в VS Code.