Помощь с библиотекой requests
С помощью библиотеки requests научился скачивать файлы, но возник такой вопрос, для соединения используется же HTTP, каким образом тогда происходит передача изображения или видео, к примеру? В коде самой библиотеки не копался.
И второй вопрос. Видел много примеров, где через requests.post предлагается, например логиниться, передавая пару логин - пароль в аргументах.
Но каким образом происходит понимание, куда именно их вставлять?
requests.post('url', data={'key':'value'})
То есть, например, используем эту команду в простейшем текстовом виде, всё понятно, просто добавляет элементы в словарь, но в более сложных операциях не очень понимаю.
Ответы (2 шт):
Каждое
HTTP-сообщение состоит из трёх частей, которые передаются в указанном порядке:
- Стартовая строка (англ. Starting line) — определяет тип сообщения;
- Заголовки (англ. Headers) — характеризуют тело сообщения, параметры передачи и прочие сведения;
- Тело сообщения (англ. Message Body) — непосредственно данные сообщения. Обязательно должно отделяться от заголовков пустой строкой.
Источник: https://ru.wikipedia.org/wiki/HTTP#Структура_протокола
Передача параметров методом
post происходит через тело сообщения. Выглядит это примерно так же, как и в методе get:
Content-Type: application/x-www-form-urlencoded
key=value&key2=value2
Файлы (изображения, видео и т. д.) передаются в двоичном представлении, при этом заголовок Content-Type имеет значение multipart/form-data.
Ответ на первый вопрос:
HTTP прекрасно справляется с выгрузкой файлов. Для этого и существует метод POST. Выгрузка файлов описана в RFC-1867
Ответ на второй вопрос:
Не очень понимаю, что вы имеете в виду под сложными операциями, однако...
Сервер тоже не пустой канал с ухом на конце, а он есть программа, в которой описан так называемый в обиходе handler, предназначенный для того, чтобы ожидать запросов извне и сразу же их обрабатывать. К примеру используя инструменты FLASK на Python можно написать простейший сервер, который принимает post-запрос, проверяет полученные данные и отправляет результат обработки пользователю. Результатом могут быть данные на сервере или же строка о закрытом доступе и неправильном пароле.
Мой рабочий пример:
...
@app.route( '/', methods = ['POST'])
def json_handler():
data = request.json
request_name = ""
if data == None:
with open("server_no_command.json") as f:
return jsonify(json.loads(f.read()))
try:
if data['command'] == "create_or_update_config":
with open("server_create_or_update_config.json") as f:
return jsonify(json.loads(f.read()))
except KeyError:
pass
try:
if data['command'] == "delete_config":
with open("server_delete_config.json") as f:
return jsonify(json.loads(f.read()))
except KeyError:
pass
...
То есть проверяем значение по ключу в полученных данных и решаем, что делать дальше. Таким же простым образом можно проверить пару логин-пасс, имея грубо говоря словарик с имеющимися юзерами и их паролями на сервере:
try:
if data[data.keys()[0]] == loginpassbase[data.keys()[0]]:
with open("server_create_or_update_config.json") as f:
return jsonify(json.loads(f.read()))
else:
return jsonify({"message":"WrongPassword"})
except KeyError:
return jsonify({"message":"WrongLogin"})
Как-то так. Давно такие штуки не делал, строго не судите)