Метод post() используется, когда мы хотим отправить какие-то данные на сервер. Затем данные сохраняются в базе данных.
- Что такое HTTP-запрос в Python?
- Ключевые моменты POST-запроса
- Что такое модуль запросов Python?
- Как использовать модуль requests в Python?
- Что такое метод requests.post() в Python?
- Синтаксис
- Параметры
- Как использовать requests.post() в Python?
- Более сложные POST-запросы
- POST-файл с кодировкой из нескольких частей
Что такое HTTP-запрос в Python?
POST отправляет данные на сервер для создания ресурса. Данные, отправленные на сервер с запросом POST, хранятся в теле запроса HTTP.
|
1 2 3 |
POST /test/add HTTP/1.1 Host: appdividend.com name1=value1&name2=value2 |
Ключевые моменты POST-запроса
- Запросы POST не имеют ограничений по длине данных. Это может быть все, что вы хотите.
- POST-запросы не сохраняются в истории браузера.
- Никогда не кэшируются.
- Не могут быть добавлены в закладки.
Что такое модуль запросов Python?
Requests — это HTTP-библиотека под лицензией Apache2, написанная на Python, которая помогает сделать HTTP-запросы более простыми и удобными для человека.
Как использовать модуль requests в Python?
Вам необходимо установить модуль запросов в вашей системе, чтобы использовать его в Python. Чтобы установить модуль requests, выполните следующую команду.
|
1 2 3 4 5 |
python3 -m pip install requests # OR pip install requests |
Чтобы использовать Pipenv для управления пакетами Python, вы можете запустить следующую команду.
|
1 |
pipenv install requests |
После установки библиотеки запросов вы можете использовать ее в своем приложении. Например, импорт запросов выглядит следующим образом.
|
1 |
import requests |
Что такое метод requests.post() в Python?
Чтобы создать запрос POST в Python, используйте метод request.post(). Метод запросов post() принимает URL-адреса, данные, json и аргументы в качестве аргументов и отправляет запрос POST на указанный URL-адрес.
Вы можете отправить данные вместе с post-запросом.
Синтаксис
|
1 |
requests.post(url, data={key: value}, json={key: value}, args) |
Параметры
| Параметр | Описание |
|---|---|
| url | обязателен, URL-адрес запроса. |
| data | необязателен. Это может быть словарь, список кортежей, байты или файловый объект для отправки по указанному url. |
| json | необязательно. Это объект JSON для отправки по указанному URL. |
| files | необязательно. Это словарь файлов для отправки по указанному url. |
| allow_redirects | необязательно. Это логическое значение для включения/отключения перенаправления. Значение по умолчанию True (разрешает перенаправление) |
| auth | необязательно. Это кортеж для включения безопасной аутентификации по протоколу HTTP. По умолчанию None |
| cert | необязательно. Это строка или кортеж, указывающий файл сертификата или ключ. По умолчанию None |
| cookies | необязательно. Это словарь файлов cookie для отправки по указанному url-адресу. По умолчанию None |
| headers | необязательно. Это словарь HTTP-заголовков для отправки по указанному URL. По умолчанию None |
| proxies | необязательно. Это словарь протокола для URL-адреса прокси-сервера. По умолчанию None |
| stream | необязательно. Логическое значение показывает, должен ли ответ быть немедленно загружен (False) или передан потоком (True). Значение по умолчанию False |
| timeout | необязательно. Это кортеж, или число, указывающее, сколько секунд требуется для ожидания, пока клиент установит соединение и отправит ответ. Аргумент по умолчанию равен None, что означает, что запрос будет продолжаться до тех пор, пока соединение не будет закрыто или потеряно. |
| verify | необязательно. Это логическое значение или строковое указание для проверки наличия TLS-сертификата сервера или нет. Значение по умолчанию True |
Как использовать requests.post() в Python?
Чтобы использовать метод request.post(), передайте URL-адрес и данные методу post() и проверьте ответ. Отправьте запрос POST на веб-сайт https://httpbin.org с помощью метода post() и распечатайте ответ.
|
1 2 3 4 |
import requests res = requests.post('https://httpbin.org/post', data={'st3': 'jim hopper'}) print(res.text) |
Выход
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "args": {}, "data": "", "files": {}, "form": { "st3": "jim hopper" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "14", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.23.0", "X-Amzn-Trace-Id": "Root=1-5ef049b1-f58a70bb84d4803c73f14e21" }, "json": null, "origin": "43.250.156.99", "url": "https://httpbin.org/post" } |
В этом примере мы получаем объект ответа, который содержит много информации. Во-первых, объект формы содержит наш ключ и значение, st3 и Jim hopper. Во-вторых, есть объект заголовка, содержащий некоторые свойства, а затем json, источник и URL.
Более сложные POST-запросы
Вы можете отправить некоторые данные, закодированные в форме, так же, как HTML-форма. Для этого вы должны передать словарь аргументу данных.
Ваш словарь данных будет автоматически закодирован с помощью формы при запросе из приложения.
|
1 2 3 4 5 6 7 8 9 |
import requests payload = { 'eleven': 'MBB', 'hopper': 'DKH' } res = requests.post('https://httpbin.org/post', data=payload) print(res.text) |
Выход
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ "args": {}, "data": "", "files": {}, "form": { "eleven": "MBB", "hopper": "DKH" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "21", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.23.0", "X-Amzn-Trace-Id": "Root=1-5ef04d9e-3b7860a6206c465070c08258" }, "json": null, "origin": "43.250.156.99", "url": "https://httpbin.org/post" } |
Бывают случаи, когда вам нужно отправить данные, которые не закодированы в форме. Например, если вы передадите строку вместо dict, данные будут опубликованы напрямую.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
import requests import json payload = { 'eleven': 'MBB', 'hopper': 'DKH' } url = 'https://httpbin.org/post' res = requests.post(url, data=json.dumps(payload)) print(res.text) |
Выход
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "args": {}, "data": "{\"eleven\": \"MBB\", \"hopper\": \"DKH\"}", "files": {}, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "34", "Host": "httpbin.org", "User-Agent": "python-requests/2.23.0", "X-Amzn-Trace-Id": "Root=1-5ef04e4d-c665add6bae7e8d044ac55aa" }, "json": { "eleven": "MBB", "hopper": "DKH" }, "origin": "43.250.156.99", "url": "https://httpbin.org/post" } |
Вы можете увидеть свойство данных. Функция Python json.dumps() преобразует словарь в строку, а затем мы печатаем строку и ее тип. Таким образом, в базе данных строка хранится напрямую.
Вместо того, чтобы кодировать dict, вы также можете передать его напрямую, используя параметр json, который будет закодирован автоматически. См. следующий код.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
import requests import json payload = { 'eleven': 'MBB', 'hopper': 'DKH' } url = 'https://httpbin.org/post' res = requests.post(url, json=payload) print(res.text) |
Это даст нам тот же результат, что и выше. Здесь мы взяли параметр json и передали словарь как значение, которое автоматически кодируется в строку.
POST-файл с кодировкой из нескольких частей
Создайте составной POST-запрос, отправив файл на сервер.
В текущем каталоге проекта у меня есть текстовый файл с именем app.txt, который имеет следующее содержимое: Hello World.
|
1 2 3 4 5 6 7 8 |
import requests files = {'file': open('app.txt', 'rb')} url = 'https://httpbin.org/post' res = requests.post(url, files=files) print(res.text) |
Выход
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "args": {}, "data": "", "files": { "file": "Hello world" }, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "154", "Content-Type": "multipart/form-data; boundary=3fca660e87944d3138832fb6651dad85", "Host": "httpbin.org", "User-Agent": "python-requests/2.23.0", "X-Amzn-Trace-Id": "Root=1-5ef050ce-4d860239803f73dffc9b35a2" }, "json": null, "origin": "43.250.156.99", "url": "https://httpbin.org/post" } |
В ответ мы получили пустой объект данных.
Мы также получили файлы для возражения в ответ, атрибут файла, значением которого является содержимое файла. В нашем случае это Hello World.
|
1 2 3 4 5 6 7 8 9 10 |
import requests files = { 'file':('app.txt', open('app.txt', 'rb'), 'application/txt', {'Expires': '0'}) } url = 'https://httpbin.org/post' res = requests.post(url, files=files) print(res.text) |
Если вы публикуете большой файл как запрос multipart/form-data, по умолчанию библиотека запросов не поддерживает этого, но за вас эту работу сделает отдельный пакет, который называется request-toolbelt.
