Отправка данных
До сих пор программа только спрашивала. Теперь научимся отправлять: создавать записи, отправлять формы, менять и удалять данные на сервере.
Методы HTTP
| Метод | Зачем | requests |
|---|---|---|
| GET | получить | requests.get |
| POST | создать запись, отправить форму | requests.post |
| PUT | заменить запись целиком | requests.put |
| PATCH | изменить часть полей | requests.patch |
| DELETE | удалить | requests.delete |
В REST API адрес обозначает ресурс, а метод — действие: POST /tasks создаёт задачу, PATCH /tasks/7 меняет седьмую, DELETE /tasks/7 удаляет её.
JSON: json=
r = requests.post(
"https://api.site.ru/tasks",
json={"title": "Купить хлеб", "done": False},
timeout=5,
)
print(r.status_code) # 201 Created
print(r.json()["id"]) # номер новой записи
json= сам превращает словарь в JSON (False → false, None → null) и ставит заголовок Content-Type: application/json. Не собирайте JSON вручную строкой: первая же кавычка в названии сломает его.
Обратите внимание на код 201 Created: при создании успех — это не обязательно 200. Надёжнее проверять r.ok или конкретный код, который обещает документация API.
Формы: data=
HTML-форма отправляет поля в другом формате — application/x-www-form-urlencoded. Для него служит data=:
r = requests.post("https://site.ru/feedback", data={"name": "Аня", "rating": 5}, timeout=5)
Если перепутать json= и data=, сервер ответит 415 Unsupported Media Type или 400.
После успешной отправки формы сайт обычно отвечает перенаправлением 303 на страницу «Спасибо». requests сам переходит по нему запросом GET, и в r.text оказывается уже итоговая страница. Цепочку переходов видно в r.history, а отключить переходы можно параметром allow_redirects=False.
Изменение и удаление
requests.patch(f"{base}/tasks/7", json={"done": True}, timeout=5) # одно поле
requests.put(f"{base}/tasks/7", json={"title": "Хлеб", "done": True}, timeout=5) # всё целиком
r = requests.delete(f"{base}/tasks/7", timeout=5)
print(r.status_code) # 204 No Content — удалено, тела нет
Синхронизация
Частая задача — привести данные на сервере к тем, что у вас. Чтобы не делать лишних запросов:
- скачайте список с сервера и разложите по ключу (
{title: task}); - для каждой своей записи: нет на сервере → POST; есть, но отличается → PATCH; совпадает → ничего;
- записи сервера, которых нет у вас, → DELETE.
Итог
post,put,patch,delete— какget, но с телом;json=для API,data=для форм; JSON вручную не собираем;- 201 Created, 204 No Content — тоже успех;
- после формы бывает 303 → requests сам идёт на итоговую страницу.