Коды состояния ответа¶
Мы можем проверить код статуса ответа:
>>> r = requests.get('https://httpbin.org/get') >>> r.status_code 200
Requests также поставляется со встроенным объектом поиска кода состояния для
удобства использования:
>>> r.status_code == requests.codes.ok True
Если мы сделали неверный запрос (ошибка клиента 4XX или ответ с ошибкой сервера
5XX), мы можем поднять его с помощью :
>>> bad_r = requests.get('https://httpbin.org/status/404') >>> bad_r.status_code 404 >>> bad_r.raise_for_status() Traceback (most recent call last): File "requests/models.py", line 832, in raise_for_status raise http_error requests.exceptions.HTTPError: 404 Client Error
Но поскольку наш для был , когда мы вызываем
, мы получаем:
>>> r.raise_for_status() None
Перенаправление и история¶
По умолчанию Requests выполняет перенаправление для всех глаголов, кроме HEAD.
Мы можем использовать свойство объекта Response для отслеживания
перенаправления.
Список содержит объекты
, которые были созданы для выполнения
запроса. Список отсортирован от самого старого до самого последнего ответа.
Например, GitHub перенаправляет весь HTTP requests на HTTPS:
>>> r = requests.get('http://github.com/') >>> r.url 'https://github.com/' >>> r.status_code 200 >>> r.history >]
Если вы используете GET, OPTIONS, POST, PUT, PATCH или DELETE, вы можете
отключить обработку перенаправления с помощью параметра :
>>> r = requests.get('http://github.com/', allow_redirects=False) >>> r.status_code 301 >>> r.history []
Если вы используете HEAD, вы также можете включить перенаправление:
Формирование динамических URL-адресов
Осталось
прописать ссылки у списка наших статей. Во-первых, определим шаблон маршрута,
по которому они будут доступны. Для этого в файле women/urls.py добавим строчку
в urlpatterns:
path('post/<int:post_id>/', show_post, name='post'),
то есть, маршрут
постов будет выглядеть так:
http://127.0.0.1:8000/post/<идентификатор_поста>/
Конечно, в
реальных проектах вместо post_id, как правило,
используется строка (слаг), записанная латиницей и отражающая суть статьи.
Такие ссылки лучше ранжируются поисковыми системами и понятнее пользователям
сайта
Позже мы тоже будем использовать слаг, но на данном этапе нам важно
разобраться, как создавать динамические URL-ссылки на
уровне шаблонов
Итак, маршрут
определен, имя маршрута задано как post, осталось
прописать функцию представления show_post. Мы ее пока
определим вот такой заглушкой:
def show_post(request, post_id): return HttpResponse(f"Отображение статьи с id = {post_id}")
Осталось все это
определить в шаблоне index.html, в котором
происходит отображение списка статей. Фактически, все что нам нужно – это
переписать следующую строчку:
<p class="link-read-post"><a href="{% url 'post' p.pk %}">Читать пост</a></p>
Смотрите, здесь
в параметре href используется
уже знакомый нам тег шаблона url, далее указываем имя ссылки post и через пробел
ее параметр post_id в виде p.pk. Вспоминаем,
что мы перебираем здесь коллекцию posts, которая хранит
ссылки на объекты класса модели Women. И у этих объектов имеется параметр pk, равный
идентификатору записи. Почему мы используем pk, а не id? В принципе,
можно указать е его, но согласно конвенции Django, лучше
использовать атрибут pk.
Если теперь
обновим главную страницу, то у всех постов появятся сформированные нами ссылки
и каждая будет соответствовать своей статье. Щелкая по любой из них, перейдем
по адресу, например:
http://127.0.0.1:8000/post/5/
и увидим строчку
«Отображение статьи с id = 5» от функции заглушки show_post. Вот так
довольно просто можно формировать различные динамические URL-адреса на
уровне шаблонов.
Как создать URL адрес
Существует небольшая пошаговая инструкция, которая объясняет, как связать ссылку с URL. Итак:
- Первым делом нужно придумать текст, который в будущем вы планируете использовать в роли URL адреса.
- После этого нужно перейти на какой-либо сайт, который позволит зарегистрировать доменное имя.
- После этого, чтобы URL адрес начал работать, нужно его разместить на хостинге. Он может быть и платным, и бесплатным, но, как правило, рекомендуется использовать именно платную версию.
Какие виды бывают
Все указатели, как правило, можно разделить не две больших группы: простые и сложные. В случае использования простой вариации, вся интересующая информация находится непосредственно в самой строке URL адреса, 1 страничка – 1 файл.
Со сложным все обстоит по другому. Они имеют наиболее сложную систему хранения и получения информации, но при этом такие адреса имеют достаточно большой список возможностей, которые невозможно реализовать на простых вариациях сайта. Сложный сайт может состоять из одной страницы, которая имеет совершенно разное содержание. Ярким примером может послужить Yandex-Search. Абсолютно любой вводимый Вами запрос приводит Вас на одну и ту же страницу. Все начинается лишь с момента добавления вопросительного запроса в поисковую строку браузера. Абсолютно все, что располагается после него называется запросом GET формы.
Вывод
Таким образом, подытожив все вышесказанное, можно сказать, что URL адрес – достаточно сложная технология, смотря как ее использовать. А она, как известно, встречается в двух вариациях – в простой и сложной. Соответственно первая достаточно проста в изучении и использовании, а вот со сложной системой надо будет немного попотеть. Ну, отсюда в принципе и соответствующее название.
Если Вы всерьез решили заняться изучением этого вопроса, то нужно еще раз познакомиться со всей важной информацией, а также постараться запомнить ее. Также стоит ознакомиться со всеми преимущества и недостатками той или иной вариации данной технологии, потому что это может достаточно сильно повлиять на Ваш выбор
В некоторых случаях изучение сложной вариации стоит того, хоть и занимает достаточно большое количество времени (смотря от интенсивности работы). В другом случае, если нужно лишь узнать, где располагается тот самый адрес, то достаточно лишь один раз прочитать и запомнить, чтобы в будущем сэкономить время. То есть становится понятно, что изучение этого вопроса может быть и сложным, и простым, смотря для каких целей он потребуется. Желаем Вам удачи!
Функция get_absolute_url()
Как я уже не раз
отмечал, фреймворк Django работает согласно паттерну MTV (Models, Templates, Views), то есть, ему
постоянно приходится связывать модели с шаблонами и видами, а значит,
формировать URL-ссылки для
выбранных записей из таблиц БД. И мы только что это делали – формировали URL-ссылки для
записей модели Women. При разработке сайтов – это типовая
операция. Поэтому, разработчики Django озаботились упрощением и
автоматизацией этой процедуры. Что они нам предлагают? Смотрите. В классах
моделей можно определять специальный метод под названием:
get_absolute_url()
который бы
возвращал полный URL-адрес для каждой конкретной записи (ассоциированной
с текущим объектом). Например, в классе модели Women мы можем
определить этот метод следующим образом:
def get_absolute_url(self): return reverse('post', kwargs={'post_id': self.pk})
Здесь
используется функция reverse, которая строит текущий URL-адрес записи на
основе имени маршрута post и словаря параметров kwargs. В данном
случае указан один параметр post_id со значением
идентификатора объекта self.pk. Разумеется,
вначале нам нужно импортировать эту функцию:
from django.urls import reverse
Все, теперь при
обращении к методу get_absolute_url объекта класса
модели Women, мы будем
получать ее URL-адрес.
Где здесь
упрощение и автоматизация? Смотрите, в шаблоне index.html, при
формировании ссылок статей, мы теперь можем вместо тега шаблона url указать метод get_absolute_url:
<p class="link-read-post"><a href="` p`.`get_absolute_url `">Читать пост</a></p>
Вспоминаем, что p как раз
ссылается на объекты класса Women, следовательно, у нее появился атрибут get_absolute_url, который мы и
прописываем
И, обратите внимание, при указании этого метода, мы не пишем в конце
круглые скобки, т.к. он здесь самостоятельно не вызывается
Вызов сделает
функция render при обработке
этого шаблона.
Почему это лучше
тега url? Представьте,
что в будущем мы изменили шаблон этой ссылки и стали выводить посты не по id, а по слагу. Тогда,
при использовании тега url, нам пришлось бы менять эти ссылки в
каждом шаблоне, заменяя self.pk на self.slug, например. В
этом как раз неудобство и источник потенциальных ошибок. Теперь, с методом get_absolute_url() нам
достаточно изменить маршрут в нем и это автоматически скажется на всех шаблонах,
где она используется.
Второй важный
момент функции get_absolute_url() заключается в
том, что согласно конвенции, модули Django используют этот
метод в своей работе (если он определен в модели). Например, стандартная
админ-панель обращается к этому методу для построения ссылок на каждую запись
наших моделей. И в дальнейшем мы увидим как это работает.
В свою очередь
тег {% url %} имеет смысл
применять для построения ссылок не связанных с моделями или, для ссылок без
параметров, используя только имена маршрутов.
Видео по теме
#1. Django — что это такое, порядок установки
#2. Модель MTV. Маршрутизация. Функции представления
#3. Маршрутизация, обработка исключений запросов, перенаправления
#4. Определение моделей. Миграции: создание и выполнение
#5. CRUD — основы ORM по работе с моделями
#6. Шаблоны (templates). Начало
#7. Подключение статических файлов. Фильтры шаблонов
#8. Формирование URL-адресов в шаблонах
#9. Создание связей между моделями через класс ForeignKey
#10. Начинаем работу с админ-панелью
#11. Пользовательские теги шаблонов
#12. Добавляем слаги (slug) к URL-адресам
#13. Использование форм, не связанных с моделями
#14. Формы, связанные с моделями. Пользовательские валидаторы
#15. Классы представлений: ListView, DetailView, CreateView
#16. Основы ORM Django за час
#17. Mixins — убираем дублирование кода
#18. Постраничная навигация (пагинация)
#19. Регистрация пользователей на сайте
#20. Делаем авторизацию пользователей на сайте
#21. Оптимизация сайта с Django Debug Toolbar
#22. Включаем кэширование данных
#23. Использование капчи captcha
#24. Тонкая настройка админ панели
#25. Начинаем развертывание Django-сайта на хостинге
#26. Завершаем развертывание Django-сайта на хостинге
URL для именованных маршрутов
Помощник используется для генерации URL-адресов для . Именованные маршруты позволяют создавать URL-адреса без привязки к фактическому URL-адресу, определенному в маршруте. Следовательно, если URL-адрес маршрута изменится, никаких изменений в ваши вызовы функции вносить не нужно. Например, представьте, что ваше приложение содержит маршрут, определенный следующим образом:
Чтобы сгенерировать URL-адрес этого маршрута, вы можете использовать помощник следующим образом:
Конечно, помощник также может использоваться для генерации URL-адресов для маршрутов с несколькими параметрами:
Любые дополнительные элементы массива, не соответствующие параметрам определения маршрута, будут добавлены в строку запроса URL:
Модели Eloquent
Вы часто будете генерировать URL-адреса, используя первичный ключ модели Eloquent. По этой причине вы можете передавать модели Eloquent в качестве значений параметров. Помощник автоматически извлечет первичный ключ модели:
Подписанные URL
Laravel позволяет вам легко создавать «подписанные» URL-адреса для именованных маршрутов. Эти URL-адреса имеют хеш «подписи», добавленный к строке запроса, который позволяет Laravel проверять, что URL-адрес не был изменен с момента его создания. Подписанные URL-адреса особенно полезны для маршрутов, которые общедоступны, но требуют уровня защиты от манипуляций с URL-адресами.
Например, вы можете использовать подписанные URL-адреса для реализации общедоступной ссылки «отказаться от подписки», которая отправляется вашим клиентам по электронной почте. Чтобы создать подписанный URL для именованного маршрута, используйте метод фасада :
Если вы хотите сгенерировать временный подписанный URL-адрес маршрута, срок действия которого истекает по истечении определенного времени, вы можете использовать метод . Когда Laravel проверяет временный подписанный URL-адрес маршрута, он гарантирует, что метка времени истечения срока, закодированная в подписанный URL-адрес, не истекла:
Проверка запросов подписанного маршрута
Чтобы убедиться, что входящий запрос имеет действительную подпись, вы должны вызвать метод для входящего запроса :
В качестве альтернативы, вы можете назначить маршруту посредник . Если его еще нет, вы должны назначить этому посреднику ключ в массиве в HTTP-ядре:
После того, как вы зарегистрировали посредников в ядре приложения, вы можете назначить его маршруту. Если входящий запрос не имеет действительной подписи, посредник автоматически вернет HTTP-ответ :
Что это такое и для чего нужен
Исходя из названия и всего вышесказанного можно сказать, что URL адрес служит непосредственно для адресации того или иного сайта. С его помощью можно узнать, где в интернете находится какой-либо ресурс. URL адрес содержит в себе название самого сайта, на который и указывает. Таким образом можно подытожить, что эта технология – очень важный элемент интернета, без которого он был бы запутанной и непонятной паутиной.
Пример того, как выглядит url (урл) адрес
Наглядным примером может послужить вот такая строчка:
Она выводится в окне, которое, в свою очередь, расположено на верхней части страницы. Он состоит из нескольких компонентов, которые образуют специальную структуру, но об этом мы поговорим позднее.
Примерно так выглядят URL адреса всех страницы в интернете. Но нужно знать, что это правильная вариация оформления. Она может быть и неправильной, отличаясь большим количеством непонятных неподготовленному человеку символов.
Структура
Для того, чтобы понять, как устроены URL адреса, нужно рассмотреть подробно их структуру. Для этого давайте еще раз обратимся к нашему сайту, который уже использовали в роли примера Выше. http://www.company.com/blog/page-name. Итак, если смотреть на эту строку, то можно разделить ее на несколько частей, которые выполняют свою функцию, итак:
- http – протокол сайта
- www.company.com – в нашем случае играет роль полного доменного имени, оно пишется в зависимости от названия сайта
- /Blog/ — Путь, который нужно проделать, чтобы найти этот файл. Иными словами – путь к файлу.
- Page.name – Имеющаяся информация о файле
Где находится
Существует достаточно много разных способов посмотреть URL адрес страницы. Если Вы обычный пользователь, который не особо разбирается в компьютерах, то просто не заморачивайте голову. Нажмите на поле адресной строки, у Вас выделится ссылка. Нажмите сочетание клавиш CTRL + C и скопируйте текст, либо проведите стандартную процедуру по копированию текста. Нажмите по выделенному тексту правой кнопкой мыши и нажмите на параметр «Копировать».
Если Вы более опытный юзер и Вам нужно скопировать URL адрес картинки, то кликните по ней правой кнопкой мыши и выберите пункт «Копировать URL картинки». Но, нужно помнить, что URL адрес имеют не только картинки или сайты, но и файлы. Для того, чтобы узнать и при надобности скопировать URL файла, нужно перейти в загрузки, кликнуть правой кнопкой мыши по интересующему Вас файлу и выбрать параметр «Копировать ссылку на загрузку». Таким образом становится понятно, что процесс стандартного копирования адреса – достаточно легкая процедура, с которой справится даже самые неопытный пользователь интернета.
Интерфейс io.Writer в Golang
Если заглянуть в документацию для функции fmt.Fprintf(), вы увидите, что в качестве первого параметра она принимает интерфейс …
Go
func Fprintf(w io.Writer, format string, a …interface{}) (n int, err error)
1 | funcFprintf(wio.Writer,format string,a…interface{})(nint,err error) |
… но мы вместо него передали объект — и все сработало хорошо.
Мы можем это сделать, потому что тип является интерфейсом, а объект , потому что у него есть метод .
Если вы новичок в Go, то урок по изучению интерфейсов поможет лучше понять некоторые аспекты текущей статьи. Достаточно знать, что на практике — везде, где вы видите параметр который имеет тип , то ему можно передать объект . Все написанное после этого будет отправлено как тело HTTP ответа.
Документация Django
Django (Джанго) — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC. Проект поддерживается организацией Django Software Foundation.
Сайт на Django строится из одного или нескольких приложений, которые рекомендуется делать отчуждаемыми и подключаемыми. Это одно из существенных архитектурных отличий этого фреймворка от некоторых других (например, Ruby on Rails). Один из основных принципов фреймворка — DRY (англ. Don’t repeat yourself).
Также, в отличие от других фреймворков, обработчики URL в Django конфигурируются явно при помощи регулярных выражений.
Для работы с базой данных Django использует собственный ORM, в котором модель данных описывается классами Python, и по ней генерируется схема базы данных.
Синтаксис
Data URL состоит из четырёх сегментов: приставки (), MIME типа, описывающего тип данных, дополнительного ключевого слова для нетекстовых данных и самой строки данных:
data:,<данные>
описывается строкой в формате MIME типа, например для JPEG файла изображения. При не указывании типа данных, браузер автоматически будет интерпретировать строку данных, как
Если данные представляют собой какую-либо текстовую информацию, вы можете просто вставить эту текстовую строку в Data URL (используя соответствующие для типа данных сущности и знаки экранирования). В ином случае вам будет необходимо использовать ключевое слово перед вставкой base64-кодированных бинарных данных. Дополнительную информацию о MIME типах вы сможете найти здесь и здесь (en-US).
Несколько примеров:
- Простые text/plain данные
- base64-кодированная версия примера выше
- HTML строка вида:
- HTML строка, вызывающая JavaScript alert функцию. Заметьте необходимость закрывающего <script> тега.
POST файл с многократным кодированием¶
Requests упрощает загрузку файлов с кодировкой Multipart:
>>> url = 'https://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 = 'https://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 = 'https://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" }, ... }
Если вы отправляете очень большой файл как запрос , вы
можете захотеть передать запрос в потоковом режиме. По умолчанию не
поддерживает это, но есть отдельный пакет, который поддерживает —
. Вы должны прочитать документацию по набору инструментов
toolbelt для получения более подробной информации о
том, как его использовать.
Информацию об отправке нескольких файлов в одном запросе см. в
разделе.
Включение подшаблонов
Blade-директива позволяет вам включать Blade-шаблон в другой шаблон. Все переменные, доступные родительскому шаблону, будут доступны и включаемому шаблону:
Хотя включаемый шаблон унаследует все данные, доступные родительскому шаблону, вы также можете передать в него массив дополнительных данных:
Само собой, если вы попробуете сделать шаблона, которого не существует, то Laravel выдаст ошибку. Если вы хотите включить шаблон, которого может не существовать, вам надо использовать директиву :
Если вы хотите включить () шаблон в зависимости от логического условия, можно использовать директиву (подключение состоится, если $boolean равно true) или директиву (подключение состоится, если $boolean равно false):
Директива подключает первый найденный шаблон:
Алиасы для подключений
If your Blade includes are stored in a subdirectory, you may wish to alias them for easier access. For example, imagine a Blade include that is stored at with the following content:
Можно задать алиас для подключения шаблона, если не хотите каждый раз обращаться к нему по длинному пути. Например, у вас есть шаблон со следующим контентом:
Можете создать алиас из шаблона в методе сервис-провайдера :
Теперь вы можете использовать этот алиас как новую директиву в шаблонах:
Отрисовка шаблонов для коллекций
Вы можете комбинировать циклы и включения в одной строке при помощи Blade-директивы :
Первый аргумент — часть шаблона, которую надо отрисовать для каждого элемента массива или коллекции. Второй аргумент — массив или коллекция для перебора, а третий — имя переменной, которое будет назначено для текущей итерации в шаблоне. Например, если вы перебираете массив , то скорее всего захотите обращаться к каждому элементу как к переменной внутри вашей части шаблона. Ключ для текущей итерации будет доступен в виде переменной в вашей части шаблона.
Вы также можете передать четвёртый аргумент в директиву . Этот аргумент определяет шаблон, который будет отрисовано, если данный массив пуст.
Restrictions on wildcards in redirect URIs
Wildcard URIs like may seem convenient, but should be avoided due to security implications. According to the OAuth 2.0 specification (), a redirection endpoint URI must be an absolute URI.
Wildcard URIs are currently unsupported in app registrations configured to sign in personal Microsoft accounts and work or school accounts. Wildcard URIs are allowed, however, for apps that are configured to sign in only work or school accounts in an organization’s Azure AD tenant.
To add redirect URIs with wildcards to app registrations that sign in work or school accounts, use the application manifest editor in App registrations in the Azure portal. Though it’s possible to set a redirect URI with a wildcard by using the manifest editor, we strongly recommend you adhere to section 3.1.2 of RFC 6749. and use only absolute URIs.
If your scenario requires more redirect URIs than the maximum limit allowed, consider the following state parameter approach instead of adding a wildcard redirect URI.
Use a state parameter
If you have several subdomains and your scenario requires that, upon successful authentication, you redirect users to the same page from which they started, using a state parameter might be helpful.
In this approach:
- Create a «shared» redirect URI per application to process the security tokens you receive from the authorization endpoint.
- Your application can send application-specific parameters (such as subdomain URL where the user originated or anything like branding information) in the state parameter. When using a state parameter, guard against CSRF protection as specified in ).
- The application-specific parameters will include all the information needed for the application to render the correct experience for the user, that is, construct the appropriate application state. The Azure AD authorization endpoint strips HTML from the state parameter so make sure you are not passing HTML content in this parameter.
- When Azure AD sends a response to the «shared» redirect URI, it will send the state parameter back to the application.
- The application can then use the value in the state parameter to determine which URL to further send the user to. Make sure you validate for CSRF protection.
Warning
This approach allows a compromised client to modify the additional parameters sent in the state parameter, thereby redirecting the user to a different URL, which is the described in RFC 6819. Therefore, the client must protect these parameters by encrypting the state or verifying it by some other means, like validating the domain name in the redirect URI against the token.
Кодирование
Существует стандарт RFC3986, который определяет список разрешённых и запрещённых символов в URL.
Запрещённые символы, например, нелатинские буквы и пробелы, должны быть закодированы – заменены соответствующими кодами UTF-8 с префиксом , например: (исторически сложилось так, что пробел в URL-адресе можно также кодировать символом , но это исключение).
К счастью, объекты делают всё это автоматически. Мы просто указываем параметры в обычном, незакодированном, виде, а затем конвертируем в строку:
Как видно, слово в пути URL-адреса и буква в параметре закодированы.
URL стал длиннее, так как каждая кириллическая буква представляется двумя байтами в кодировке UTF-8.
Раньше, до того как появились объекты , люди использовали для URL-адресов обычные строки.
Сейчас часто удобнее, но строки всё ещё можно использовать. Во многих случаях код с ними короче.
Однако, если мы используем строку, то надо самим позаботиться о кодировании специальных символов.
Для этого есть встроенные функции:
- encodeURI – кодирует URL-адрес целиком.
- decodeURI – декодирует URL-адрес целиком.
- encodeURIComponent – кодирует компонент URL, например, параметр, хеш, имя пути и т.п.
- decodeURIComponent – декодирует компонент URL.
Возникает естественный вопрос: «Какая разница между и ? Когда использовать одну и другую функцию?»
Это легко понять, если мы посмотрим на URL-адрес, разбитый на компоненты на рисунке выше:
Как мы видим, в URL-адресе разрешены символы , , , , .
…С другой стороны, если взглянуть на один компонент, например, URL-параметр, то в нём такие символы должны быть закодированы, чтобы не поломать форматирование.
- кодирует только символы, полностью запрещённые в URL.
- кодирует эти же символы плюс, в дополнение к ним, символы , , , , , , , , , и .
Так что для URL целиком можно использовать :
…А для параметров лучше будет взять :
Сравните с :
Как видим, функция не закодировала символ , который является разрешённым в составе полного URL-адреса.
Но внутри параметра поиска символ должен быть закодирован, в противном случае мы получим , что значит плюс непонятный параметр . Не то, что предполагалось.
Чтобы правильно вставить параметр поиска в строку URL, мы должны использовать для него только . Наиболее безопасно кодировать и имя, и значение, за исключением случаев, когда мы абсолютно уверены в том, что они содержат только разрешённые символы.
Разница в кодировании с
Классы и базируются на последней спецификации URI, описывающей устройство адресов: RFC3986, в то время как функции – на устаревшей версии стандарта RFC2396.
Различий мало, но они есть, например, по-разному кодируются адреса IPv6:
Как мы видим, функция заменила квадратные скобки , сделав адрес некорректным. Причина: URL-адреса IPv6 не существовали в момент создания стандарта RFC2396 (август 1998).
Тем не менее, такие случаи редки. По большей части функции работают хорошо.
Поддерживаемые схемы
HTTPS: схема HTTPS () поддерживается для всех URI перенаправления на базе протокола HTTP.
HTTP: схема HTTP () поддерживается только для URI перенаправления localhost и используется исключительно на этапах локальной разработки и тестирования приложения.
Пример URI перенаправления | Срок действия |
---|---|
Допустимо | |
Допустимо | |
Допустимо | |
Недопустимо | |
Допустимо | |
Допустимо |
Исключения для localhost
В соответствии с разделами RFC 8252 и , для URI перенаправления с замыканием на себя (localhost) действуют два особых правила:
- Схемы URI допустимы, поскольку перенаправление никогда не покидает устройство. Таким образом, приемлемыми являются оба этих URI:
- Из-за временного характера диапазонов портов, часто используемых собственными приложениями, компонент порта (например, или ) при сопоставлении URI перенаправления игнорируется. В результате все эти URI считаются эквивалентными:
С точки зрения разработки это означает несколько моментов:
Не регистрируйте несколько URI перенаправления, если в них различается только порт
Сервер входа будет произвольным образом выбирать один из них и использовать связанные с этим URI параметры (например, в зависимости от того, относится ли это перенаправление к типу , , или ).
Это особенно важно, если вы планируете использовать в одном зарегистрированном приложении разные потоки проверки подлинности (например, и выдачу кода авторизации, и неявный поток). Чтобы связать с каждым URI перенаправления правильные параметры ответа, сервер входа должен иметь возможность различать эти URI, что невозможно, если различается только порт.
Чтобы зарегистрировать несколько URI перенаправления по адресу localhost для тестирования различных потоков в процессе разработки, используйте для них разный компонент пути
Например, не эквивалентно .
IPv6-адрес замыкания на себя () в настоящее время не поддерживается.
Выбор 127.0.0.1 вместо localhost
Чтобы работу приложения не нарушали неправильно настроенные брандмауэры или переименованные сетевые интерфейсы, используйте в URI перенаправления IP-адрес замыкания на себя в виде вместо . Например, .
При этом текстовое поле URI перенаправления на портал Azure нельзя использовать для добавления URI замыкания на себя со схемой :
Чтобы добавить URI перенаправления, использующий схему с -адресом замыкания на себя, в настоящее время необходимо изменить атрибут .
Более сложный POST запросы¶
Как правило, вы хотите отправить некоторые закодированные в форме данные —
очень похоже на HTML-форму. Для этого просто передайте словарь в аргумент
. Ваш словарь данных будет автоматически закодирован, когда будет
сделан запрос:
>>> payload = {'key1' 'value1', 'key2' 'value2'} >>> r = requests.post("https://httpbin.org/post", data=payload) >>> print(r.text) { ... "form": { "key2": "value2", "key1": "value1" }, ... }
Аргумент также может иметь несколько значений для каждого ключа. Это
можно сделать, сделав либо списком кортежей, либо словарем со списками
в качестве значений. Это особенно полезно, когда в форме есть несколько
элементов, использующих один и тот же ключ:
>>> payload_tuples = >>> r1 = requests.post('https://httpbin.org/post', data=payload_tuples) >>> payload_dict = {'key1' 'value1', 'value2']} >>> r2 = requests.post('https://httpbin.org/post', data=payload_dict) >>> print(r1.text) { ... "form": { "key1": [ "value1", "value2" }, ... } >>> r1.text == r2.text True
Бывают случаи, когда вам может потребоваться отправить данные, не
закодированные в форме. Если вы передадите вместо , эти
данные будут опубликованы напрямую.
Например, GitHub API v3 принимает данные POST/PATCH в кодировке JSON:
>>> import json >>> url = 'https://api.github.com/some/endpoint' >>> payload = {'some' 'data'} >>> r = requests.post(url, data=json.dumps(payload))
Вместо того, чтобы кодировать самостоятельно, вы также можете передать
его напрямую, используя параметр (добавлен в версии 2.4.2), и он будет
закодирован автоматически:
>>> url = 'https://api.github.com/some/endpoint' >>> payload = {'some' 'data'} >>> r = requests.post(url, json=payload)
Обратите внимание, что параметр игнорируется, если передан
или