Как принимать post запросы python
Перейти к содержимому

Как принимать post запросы python

  • автор:

Flask. Обработчики запросов.¶

В предыдущем разделе было реализовано web-приложение с использованием Flask, которое может обрабатывать GET-запросы по корневому пути.

@app.route('/') def sample(): return 'Был получен GET-запрос.' 

Обработчик — обычная функция, которая отмечается как обработчик с указанием пути: @app.route(‘/’) .

HTTP-методы¶

При реализации простого сервера требовалось реализовывать специальные методы для обработки различных HTTP-методов.

  • do_GET
  • do_POST
  • и т.д.

При работе с Flask достаточно передать список методов, которые должен принимать тот или иной обработчик:

@app.route('/', methods=['GET']) def sample(): return 'Был получен GET-запрос.' 

Таким образом, обработчик sample будет обрабатывать исключительно GET-запросы. При попытке обратиться по указанному пути с другим HTTP-методом будет вызвана ошибка.

Обработка параметров¶

Любое приложение работает с данными. Данные в приложение могут поступать несколькими способами:

  • В пути запроса(GET)
  • В теле запроса(POST, PUT и т.д.)

Обработка параметров в пути запросов¶

Для запроса с GET-методом возможно передать данные только в пути самого запроса, и Flask предоставляет удобный способ для передачи их в обработчик:

@app.route('/say/') def say(phrase): return f'Была получена фраза phrase>' 

Для передачи параметра в обработчик достаточоно добавить его имя в путь @app.route(‘/say/’) . Важно, что бы оно начиналось со знака < , и заканчивалось >. Затем это же имя указывается в качестве аргумента функции-обработчика. Flask так же предоставляет возможность указать и тип принимаемого параметра:

@app.route('/sum/') def sum_numbers(number): return f'Результат сложения 5 и number> = 5+number>' 

Для указания типа достаточно добавить его название перед именем параметра: .

Обработка параметров в теле запросов¶

Как было видно из предыдущих пунктов, в обрабочик не передается сам запрос. Для того что бы получить к нему доступ требуется импортировать специальный объект Flask — request , в нем то и будет содержаться вся информация по запросу:

from flask import request @app.route('/calc/', methods=['GET', 'POST']) def calc(): if request.method == 'POST': a = int(request.form['a']) b = int(request.form['b']) result = a + b return f'a> + b> = result>' return f'Был получен request.method> запрос.' 

Задания¶

Разработайте приложение по просмотру и добавлению информации об учениках курса. Функции приложения:

  1. Просмотр списка учащихся(ФИО, курс).
  2. Просмотр полной информации о конкретном учащемся.
  3. Добавление нового учащегося.

Информация об учащемся должна содержать: ФИО, курс, сколько лет. Для хранения данных используйте словари( dict ).

Дополнительно¶

Доработайте приложение так, что бы для хранения информации использовались файлы.

© Copyright Revision d00c0df4 .

Built with Sphinx using a theme provided by Read the Docs.
Read the Docs v: latest

Versions latest Downloads html On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.

Самоучитель по запросам в Python: GET и POST для чайников

В веб-программировании на Python самое базовое знание, которое вы должны глубоко и тщательно освоить (прежде чем двигаться дальше), это техника HTTP-запросов. Несмотря на то, что в Python есть несколько популярных HTTP-библиотек, самой простой является библиотека Requests. В этом посте для начинающих мы последовательно описали все основные операции/режимы этой популярной библиотеки.

Курс Project Manager.

Впроваджуйте покроковий алгоритм управління проєктами вже зараз. У цьому вам допоможе Павло Харіков — Head of IoT у Veon Group (Kyivstar).

Этот пост — вольный перевод на русский вот этой оригинальной статьи (с нашими дополнениями в местах, где это показалось нужным), которую написал Анирудх Рао.

В этой статье, посвященной веб-запросам в Python, я объясню все основы модуля Requests и расскажу, как можно отправлять запросы HTTP/1.1 с помощью Python. К концу этого поста вы сможете выполнять простейший веб-скрейпинг (и даже парсинг веб-страниц) с помощью Python. В посте я рассмотрю следующие темы:

  • Что такое веб-запросы Python?
  • Как установить модуль Requests в Python?

Це хороший спосіб розвитку вашої кар’єри в IT-індустрії. Після проходження курсу Mate гарантує вам офер мрії.

Давайте начнем наш пост в стиле «Мини-учебника по запросам» с того, что узнаем, что такое модуль запросов.

Что такое запросы в Python?

Requests — это модуль Python, который можно использовать для отправки всех видов HTTP-запросов. Это простая в использовании библиотека с множеством функций, начиная от передачи параметров в URL и заканчивая отправкой пользовательских заголовков и SSL-проверкой. В этом руководстве вы узнаете, как использовать эту библиотеку для отправки простых HTTP-запросов в Python. Но даже если у вас что-то не будет получаться, то всегда можно перенять знания у опытных специалистов, которые проводят онлайн курсы в школе наших партнеров Mate Academy.

Requests позволяет отправлять запросы протокола HTTP/1.1. Можно добавлять заголовки, данные формы, многокомпонентные файлы и параметры с помощью простых словарей Python, а также получать доступ к данным ответа таким же образом.

Как установить модуль Requests в Python?

Чтобы установить requests , просто сделайте это:

Курс Англійської.
Онлайн-навчання англійської за методикою Кембриджу — вибір понад мільярда людей.

$ pip install requests

Или, если необходимо, добавьте:

$ easy_install requests

Как сделать GET-запрос?

Отправить HTTP-запрос с помощью Requests довольно просто. Для начала нужно импортировать модуль, а затем сделать запрос.

Итак, мы где-то храним информацию, верно?

Да, объект Response хранит информацию запроса.

Допустим, вам нужна кодировка веб-страницы, чтобы вы могли проверить ее или использовать где-то еще. Мы можем сделать это, используя свойство req.encoding .

Дополнительный плюс в том, что можно также извлечь многие характеристики, например, код состояния (запроса). Это можно сделать с помощью свойства req.status_code , вот так:

req.encoding # возвращает 'utf-8' req.status_code # возвращает 200

Также можно получить доступ к cookies, которые сервер отправил обратно. Это делается с помощью req.cookies , вот так все просто! Аналогично можно получить и заголовки ответа. Для этого используется req.headers .

Обратите внимание, что свойство req.headers возвращает словарь заголовков ответа без учета регистра. Что это означает?

Курс Англійської.
Онлайн-навчання англійської за методикою Кембриджу — вибір понад мільярда людей.

Это означает, что req.headers[‘Content-Length’], req.headers[‘content-length’] и req.headers[‘CONTENT-LENGTH’] вернут значение только заголовка ответа ‘Content-Length’ .

Мы также можем проверить, является ли полученный ответ правильно сформированным HTTP-перенаправлением (или нет), которое могло быть обработано автоматически, используя свойство req.is_redirect . Это свойство возвращает True или False в зависимости от полученного ответа.

Также можно получить время, прошедшее с момента отправки запроса до получения ответа, используя другое свойство. Угадаете его название? Да, это свойство req.elapsed .

Помните URL, который вы изначально передали функции get() ? Так вот, он может отличаться от конечного URL ответа по многим причинам, включая перенаправления.

Чтобы увидеть фактический URL-адрес ответа, можно использовать свойство req.url .

import requests req = requests.get('http://www.edureka.co/') req.encoding # returns 'utf-8' req.status_code # returns 200 req.elapsed # returns datetime.timedelta(0, 1, 666890) req.url # returns 'https://edureka.co/' req.history req.headers['Content-Type'] # returns 'text/html; charset=utf-8'

Согласны, что получать всю эту служебную информацию о веб-странице — очень интересная возможность? Но вы, скорее всего, хотите чего-то большего — получить доступ к реальному содержимому страницы, верно?

Если содержимое, к которому вы обращаетесь, является текстом, вы всегда можете использовать свойство req.text для доступа к нему. Обратите внимание, что содержимое будет разобрано только как юникод. Вы можете передать кодировку, с помощью которой можно декодировать текст, используя свойство req.encoding , как мы обсуждали ранее.

В случае нетекстовых ответов к ним получить доступ также очень просто. Фактически это делается в двоичном формате, когда используется req.content . Этот модуль автоматически декодирует для нас передаваемые кодировки gzip и deflate . Это может быть очень полезно, когда вы имеете дело непосредственно с медиафайлами. Кроме того, можно получить доступ к JSON-кодированному содержимому ответа, если оно существует, используя функцию req.json() .

Довольно просто и очень гибко

Кроме того, при необходимости можно получить необработанный raw-ответ от сервера, просто используя req.raw . Имейте в виду, что вам придется передать stream=True в запросе, чтобы получить необработанный ответ в соответствии с вашими потребностями.

Но некоторые файлы, которые вы загружаете из интернета с помощью модуля Requests , могут иметь огромный размер, верно? В таких случаях не стоит сразу загружать весь ответ или файл в память сервера. При правильном подходе рекомендуется загружать такой файл по частям или кусками, используя метод iter_content(chunk_size = 1, decode_unicode = False) .

Итак, этот метод итерирует данные ответа в количестве байт chunk_size за один раз. А когда stream=True в запросе, этот метод позволит избежать чтения всего файла в память за один раз только для реально больших ответов.

Обратите внимание, что параметр chunk_size может быть как целым числом, так и None . Если параметр chunk_size имеет целочисленное значение, то он определяет количество байт, которые должны быть считаны в память за один раз.

Когда chunk_size установлен в None , а stream установлен в True , данные будут считываться по мере их поступления в виде кусков любого размера. Но если chunk_size установлен в None , а stream установлен в False , все данные будут возвращаться только как один кусок данных.

Далее в этом посте «Мини-учебника по запросам» мы рассмотрим, как можно загрузить изображение с помощью модуля Requests . Давайте попробуем применить всю эту теорию к чему-то из реального мира.

Загрузка изображения с помощью модуля Requests

Итак, давайте загрузим следующее изображение леса с помощью модуля Requests , о котором мы узнали. Вот фактическое изображение для тестирования:

Вот код, который вам понадобится для загрузки изображения:

import requests req = requests.get('path/to/forest.jpg', stream=True) req.raise_for_status() with open('Forest.jpg', 'wb') as fd: for chunk in req.iter_content(chunk_size=50000): print('Received a Chunk') fd.write(chunk)

Обратите внимание, что ‘path/to/forest.jpg’ — это фактический URL изображения. Вы можете подставить сюда URL highload.today, либо любого другого хоста-источника, чтобы загрузить что-то еще. Это просто пример, размер данного файла изображения составляет около 185 Кб, а размер chunk_size установлен на 50 000 байт.

Это означает, что при тестировании загрузки сообщение «Received a Chunk» должно быть выведено в терминале четыре раза. Размер последнего чанка будет равен 39 350 байт, потому что часть файла, которую осталось получить после первых трех итераций, равна 39 350 байт. Если вы посчитали все так же, как и мы, значит, понимаете все правильно.

Запросы также позволяют передавать параметры в URL. Это особенно полезно, когда вы ищете веб-страницу по каким-то результатам, например, учебник или конкретное изображение. Это работает и с поиском в Google. Можно передать эти строки запроса в виде словаря строк, используя ключевое слово params в запросе GET. Посмотрите этот простой пример:

import requests query = req = requests.get('https://pixabay.com/en/photos/', params=query) req.url # returns 'https://pixabay.com/en/photos/?order=popular_height=600&q=Forest&min_width=800'

Все готово, далее в этом руководстве мы рассмотрим, как сделать свой первый POST-запрос!

Как сделать POST-запрос?

Выполнить POST-запрос так же просто, как и GET-запрос. Просто используйте функцию post() вместо get() .

Это может быть полезно при автоматической отправке форм. Например, следующий код загрузит всю страницу Википедии о нанотехнологиях и сохранит ее на вашем компьютере.

import requests req = requests.post('https://en.wikipedia.org/w/index.php', data = ) req.raise_for_status() with open('Nanotechnology.html', 'wb') as fd: for chunk in req.iter_content(chunk_size=50000): fd.write(chunk)

Если вы хотите стать экспертом в языке программирования python, то обратите внимание на курсы наших партнеров Mate Academy и Powercode. Их выпускники работают в крупных компаниях по всему миру.

Как вставить заголовки и Cookies в такой запрос?

Как уже упоминалось ранее, вы можете получить доступ к кукам и заголовкам, которые сервер отправляет вам обратно, используя req.cookies и req.headers . Запросы также позволяют вам отправлять собственные пользовательские куки и заголовки вместе с запросом. Это может быть полезно, когда вы хотите, например, установить определенный пользовательский агент для вашего запроса.

Чтобы добавить HTTP-заголовки в запрос, вы можете просто передать их в виде dict в параметр headers . Аналогичным образом вы можете отправить на сервер свои собственные cookies, используя dict , переданный в параметре cookies.

import requests url = 'http://some-domain.com/set/cookies/headers' headers = cookies = req = requests.get(url, headers=headers, cookies=cookies)

Cookie jar также могут хранить файлы cookie. Они предоставляют более полный интерфейс, позволяющий использовать эти куки по нескольким путям.

Посмотрите на этот обзорный пример ниже:

import requests jar = requests.cookies.RequestsCookieJar() jar.set('first_cookie', 'first', domain='httpbin.org', path='/cookies') jar.set('second_cookie', 'second', domain='httpbin.org', path='/extra') jar.set('third_cookie', 'third', domain='httpbin.org', path='/cookies') url = 'http://httpbin.org/cookies' req = requests.get(url, cookies=jar) req.text # returns '< "cookies": < "first_cookie": "first", "third_cookie": "third" >>'


Что такое сессионные объекты?

Иногда полезно сохранять определенные параметры при нескольких запросах. Объект Session делает именно это. Например, он сохраняет данные cookie во всех запросах, сделанных с помощью одной и той же сессии.

Объект Session в Python использует пул соединений urllib3 . Это означает, что базовое TCP-соединение будет повторно использоваться для всех запросов, сделанных к одному и тому же хосту.

Это может значительно повысить производительность. Также можно использовать методы объекта Requests с объектом Session .

Сессии также полезны, когда вы хотите отправлять одни и те же данные во всех запросах. Например, если вы решили отправлять cookie или заголовок user-agent при всех запросах к определенному домену, можно использовать объекты Session .

import requests ssn = requests.Session() ssn.cookies.update() reqOne = ssn.get('http://httpbin.org/cookies') print(reqOne.text) # prints information about "visit-month" cookie reqTwo = ssn.get('http://httpbin.org/cookies', cookies=) print(reqTwo.text) # prints information about "visit-month" and "visit-year" cookie reqThree = ssn.get('http://httpbin.org/cookies') print(reqThree.text) # prints information about "visit-month" cookie

Как можете видеть, сессионный файл cookie «visit-month» отправляется со всеми тремя запросами. Однако cookie «visit-year» отправляется только во время второго запроса. В третьем запросе также нет упоминания о cookie «visit-year» . Это подтверждает тот факт, что файлы cookie или другие данные, установленные в отдельных запросах, не будут отправлены с другими сессионными запросами.

Подведение итогов

В качестве закрепления, еще раз тезисно пробежим по самому главному из того, что мы узнали выше. HTTP — это набор протоколов, предназначенных для обеспечения связи между клиентами и серверами. Он работает как протокол «запрос-ответ» между клиентом и сервером.

В качестве клиента может выступать веб-браузер, а в качестве сервера — приложение на компьютере, на котором размещен веб-сайт.

Таким образом, чтобы запросить ответ от сервера, существует два стандартных метода в рамках HTTP/1.1:

  • GET: запрос данных с сервера.
  • POST: отправка данных для обработки на сервер.

Вот простая диаграмма, которая объясняет основную концепцию методов GET и POST:

Теперь, чтобы выполнять HTTP-запросы в Python, мы можем использовать несколько популярных в Python HTTP-библиотек, таких как:

Самой элегантной и простой из перечисленных выше библиотек является библиотека Requests . В этом посте выше мы последовательно описали все основные операции из самой популярной Python-библиотеки Requests .

Курс Комерційний директор.

Зосередження на практичних завданнях та послідовному аналізі проектів замість великої теорії. Реалізуй свої мрії про керівну посаду після завершення курсу.

GET и POST запросы c модулем requests в Python

Методы requests.get() и requests.post() модуля requests

Передача параметров в URL для HTTP GET-запросов.

Часто в строке запроса URL-адреса, необходимо отправить какие-то данные. При составлении URL-адреса вручную, эти данные задаются в виде пар ключ/значение в конце URL-адреса после вопросительного знака, например httpbin.org/get?key=val . Модуль requests позволяет передавать эти параметры в метод requests.get() виде словаря строк, используя ключевой аргумент params . Например, если надо передать key1=value1 и key2=value2 для GET запроса к URL-адресу httpbin.org/get , то используйте следующий код:

>>> import requests # подготовка дополнительных параметров для GET запроса >>> params = 'key1': 'value1', 'key2': 'value2'> >>> resp = requests.get('https://httpbin.org/get', params=params) # смотрим, что URL-адрес был правильно закодирован >>> print(resp.url) # https://httpbin.org/get?key2=value2&key1=value1 

Обратите внимание, что любой ключ словаря, значение которого равно None , не будет добавлен в строку запроса URL-адреса.

В качестве значения словаря можно передать список дополнительных элементов URL-адреса:

>>> import requests # ключ словаря 'key2' имеет список значений >>> params = 'key1': 'value1', 'key2': ['value2', 'value3']> # создаем GET запрос >>> resp = requests.get('https://httpbin.org/get', params=params) # смотрим полученный URL >>> print(resp.url) # https://httpbin.org/get?key1=value1&key2=value2&key2=value3 

Передача параметров в URL для HTTP POST-запросов.

Как правило, в POST-запросах встает необходимость отправить некоторые закодированные в форме данные. Для этого необходимо передать словарь в аргумент data метода requests.post() . Словарь с данными формы будет автоматически закодирован.

Обратите внимание, что имя аргумента для передачи параметров метода requests.post() , отличается от имени аргумента дополнительных параметров метода requests.get() .

>>> import requests # подготовка параметров для POST-запроса >>> param = 'key1': 'value1', 'key2': 'value2'> # обратите внимание, что для метода POST, аргумент для # передачи параметров в запрос отличается от метода GET >>> resp = requests.post("https://httpbin.org/post", data=param) >>> print(resp.text) # # . # "form": # "key2": "value2", # "key1": "value1" # >, # . # > 

Аргумент data также может иметь несколько значений для каждого ключа. Это можно сделать, передав данные либо списком кортежей, либо словарем со списками в качестве значений. Это особенно полезно, когда форма содержит несколько элементов, использующих один и тот же ключ:

>>> import requests >>> param_tuples = [('key1', 'value1'), ('key1', 'value2')] >>> resp1 = requests.post('https://httpbin.org/post', data=payload_tuples) >>> param_dict = 'key1': ['value1', 'value2']> >>> resp2 = requests.post('https://httpbin.org/post', data=payload_dict) >>> print(resp1.text) # # . # "form": # "key1": [ # "value1", # "value2" # ] # >, # . # > >>> resp1.text == resp2.text # True 
  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • GET и POST запросы c модулем requests
  • Получение/отправка заголовков сервера модулем requests
  • Извлечение и установка cookies с модулем requests
  • Сессии/сеансы Session() модуля requests
  • Объект ответа сервера Response модуля requests
  • Получение и отправка данных в виде JSON с модулем requests
  • Установка timeout для модуля requests
  • Объект PreparedRequest модуля requests
  • Загрузка файлов на сервер модулем requests
  • Загрузка больших данных модулем requests
  • HTTP-прокси или SOCKS-прокси с модулем requests
  • Использование хуков модуля requests
  • Аутентификация с модулем requests
  • SSL и модуль requests

Обработка данных входящих запросов в Flask

Обработка данных входящих запросов в Flask

Веб-приложениям часто требуется обрабатывать данные входящих запросов пользователей. Эта полезная нагрузка может иметь форму строк запросов, данных форм и объектов JSON. Flask, как и любая другая веб-инфраструктура, предоставляет доступ к данным запросов.

В этом учебном модуле мы создадим приложение Flask с тремя маршрутами, которое будет принимать строки запросов, данные форм и объекты JSON.

Предварительные требования

Для данного обучающего руководства вам потребуется следующее:

  • Для данного проекта потребуется установить Python в локальной среде.
  • В этом проекте мы будем использовать инструмент Pipenv, предоставляющий отличные возможности упаковки для программирования на Python. Он предоставляет возможности Pipfile, pip и virtualenv в одной команде.
  • Для тестирования конечных точек API потребуется установить Postman или другой подобный инструмент.

Для этого учебного модуля мы использовали версии Pipenv v2020.11.15, Python v3.9.0 и Flask v1.1.2.

Настройка проекта

Чтобы продемонстрировать разные способы использования запросов, мы создадим приложение Flask. Хотя в примере используется упрощенная структура отображения функций и маршрутов, уроки этого учебного модуля можно применить к любым методам организации представлений, включая представления на базе классов, эскизов или расширений, таких как Flask-Via.

Прежде всего, вам нужно будет создать каталог для проекта. Откройте терминал и запустите следующую команду:

Затем перейдите в новый каталог:

Затем установите Flask. Откройте терминал и запустите следующую команду:

Команда pipenv создаст среду virtualenv для этого проекта, Pipfile, install flask и Pipfile.lock.

Для активации virtualenv этого проекта запустите следующую команду:

Чтобы получить доступ к входящим данным в Flask, вам нужно будет использовать объект request . В объекте request хранятся все входящие данные запроса, включая тип MIME, источник, IP-адрес, необработанные данные, метод HTTP, заголовки и т. д.

Хотя вся информация в объекте request может быть полезной для наших целей, в этом учебном модуле мы уделим основное внимание данным, которые обычно предоставляются вызывающей стороной напрямую.

Чтобы получить доступ к запрашиваемому объекту в Flask, вам потребуется импортировать его из библиотеки Flask:

from flask import request 

После этого у вас появится возможность использовать его в любых ваших функциях представлений.

Используйте редактор кода для создания файла app.py . Импортируйте Flask и объект request . Также установите маршруты для query-example , form-example и json-example :

# import main Flask class and request object from flask import Flask, request # create the Flask app app = Flask(__name__) @app.route('/query-example') def query_example(): return 'Query String Example' @app.route('/form-example') def form_example(): return 'Form Data Example' @app.route('/json-example') def json_example(): return 'JSON Object Example' if __name__ == '__main__': # run app in debug mode on port 5000 app.run(debug=True, port=5000) 

Затем откройте терминал и запустите приложение с помощью следующей команды:

Приложение будет запущено на порту 5000, чтобы вы могли просмотреть каждый маршрут в браузере, используя следующие ссылки:

http://127.0.0.1:5000/query-example (or localhost:5000/query-example) http://127.0.0.1:5000/form-example (or localhost:5000/form-example) http://127.0.0.1:5000/json-example (or localhost:5000/json-example) 

Код устанавливает три маршрута, и при открытии каждого маршрута вы увидите сообщения «Query String Example» , «Form Data Example» и «JSON Object Example» .

Использование аргументов запроса

Аргументы URL, добавляемые в строку запроса, часто используются для передачи данных в веб-приложение. Возможно, вам уже приходилось видеть строку запроса на веб-страницах.

Строка запроса выглядит следующим образом:

example.com?arg1=value1&arg2=value2 

Строка запроса начинается после знака ( ? ) вопроса:

example.com?arg1=value1&arg2=value2 

В ней содержатся пары ключ-значение, разделенные символом амперсанда ( & ):

example.com?arg1=value1&arg2=value2 

В каждой паре после ключа идет знак равенства ( = ), а затем идет значение.

arg1 : value1 arg2 : value2 

Строки запросов полезны для передачи данных, которые не требуют действий со стороны пользователя. Вы можете сгенерировать строку запроса в своем приложении и добавить ее к URL так, чтобы при запросе пользователя данные передавались автоматически. Строка запроса также может быть сгенерирована формами, использующими метод GET.

Давайте добавим строку запроса в маршрут query-example . В этом гипотетическом примере, мы укажем имя языка программирования, которое будет отображаться на экране. Создайте ключ «language» и значение «Python» :

http://127.0.0.1:5000/query-example?language=Python 

Если вы запустите приложение и перейдете к этому URL, вы увидите сообщение «Query String Example» .

Вам нужно будет программировать часть, обрабатывающую аргументы запроса. Этот код считает ключ language , используя request.args.get(‘language’) или request.args[‘language’] .

При вызове request.args.get(‘language’) приложение продолжит работу, если ключ language отсутствует по указанному URL. В этом случае данный метод будет иметь результат None .

При вызове request.args[‘language’] приложение возвращает ошибку 400, если ключ language отсутствует по указанному URL.

При работе со строками запросов, рекомендуется использовать request.args.get() , чтобы предотвратить возможные сбои в работе приложения.

Давайте прочитаем ключ language и выведем его.

Измените маршрут query-example в app.py с помощью следующего кода:

@app.route('/query-example') def query_example(): # if key doesn't exist, returns None language = request.args.get('language') return '''

The language value is: <>

'''
.format(language)

Затем запустите приложение и перейдите к URL:

http://127.0.0.1:5000/query-example?language=Python 

Браузер должен вывести следующее сообщение:

Output
The language value is: Python

Аргумент из URL привязывается к переменной language , а затем возвращается через браузер.

Чтобы добавить дополнительные параметры запроса, вы можете добавить амперсанды и новые пары ключ-значение в конце URL. Создайте ключ «framework» и значение «Flask» :

http://127.0.0.1:5000/query-example?language=Python&framework=Flask 

Если вам нужно больше, продолжайте добавлять амперсанды и пары ключ-значение. Создайте ключ «website» и значение «DigitalOcean» :

http://127.0.0.1:5000/query-example?language=Python&framework=Flask&website=DigitalOcean 

Чтобы получить доступ к этим значениям, мы все равно используем request.args.get() или request.args[] . Давайте используем оба варианта, чтобы продемонстрировать, что произойдет при отсутствии ключа. Измените маршрут query_example , чтобы назначить значение результатов переменным и вывести их:

@app.route('/query-example') def query_example(): # if key doesn't exist, returns None language = request.args.get('language') # if key doesn't exist, returns a 400, bad request error framework = request.args['framework'] # if key doesn't exist, returns None website = request.args.get('website') return '''  

The language value is: <>

The framework value is: <>

The website value is: <>'''.format(language, framework, website)

Затем запустите приложение и перейдите к URL:

http://127.0.0.1:5000/query-example?language=Python&framework=Flask&website=DigitalOcean 

Браузер должен вывести следующее сообщение:

Output
The language value is: Python The framework value is: Flask The website value is: DigitalOcean

Удалите ключ language из URL:

http://127.0.0.1:5000/query-example?framework=Flask&website=DigitalOcean 

Браузер должен вывести следующее сообщение со словом None , если для language будет отсутствовать значение:

Output
The language value is: None The framework value is: Flask The website value is: DigitalOcean

Удалите ключ framework из URL:

http://127.0.0.1:5000/query-example?language=Python&website=DigitalOcean 

Браузер должен вывести сообщение об ошибке, потому что он ожидает получить значение framework :

Output
werkzeug.exceptions.BadRequestKeyError werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand. KeyError: 'framework'

Теперь вы должны понимать, как следует обрабатывать строки запросов. Перейдем к следующему типу входящих данных.

Использование данных форм

Данные форм поступают из форм, отправленных на маршрут в виде запроса POST. Вместо отображения данных в URL (кроме случаев отправки форм в виде запроса GET) данные форм передаются приложению незаметно. Хотя вы не видите передаваемые данные форм, ваше приложение может их считывать.

Чтобы продемонстрировать это, давайте изменим маршрут form-example в app.py так, чтобы принимать запросы GET и POST и возвращать форму:

# allow both GET and POST requests @app.route('/form-example', methods=['GET', 'POST']) def form_example(): return '''   form method="POST"> 
Language:
Framework:
'''

Затем запустите приложение и перейдите к URL:

http://127.0.0.1:5000/form-example 

Браузер должен отображать форму с двумя полями ввода: одно language и одно для framework , а также кнопку отправки.

Важнее всего знать об этой форме то, что она выполняет запрос POST к тому же маршруту, который сгенерировал форму. Все ключи, которые считываются в приложении, поступают от атрибутов name в полях ввода формы. В этом случае language и framework являются именами полей ввода, и поэтому у вас будет доступ к ним в приложении.

Внутри функции просмотра вам нужно будет проверить метод запроса: GET или POST. Если это запрос GET, вы можете вывести форму. В противном случае это запрос POST, и вам нужно обработать входящие данные.

Измените маршрут form-example в app.py , добавив следующий код:

# allow both GET and POST requests @app.route('/form-example', methods=['GET', 'POST']) def form_example(): # handle the POST request if request.method == 'POST': language = request.form.get('language') framework = request.form.get('framework') return '''  

The language value is: <>

The framework value is: <>

'''
.format(language, framework)
# otherwise handle the GET request return '''
Language:
Framework:
'''

Затем запустите приложение и перейдите к URL:

http://127.0.0.1:5000/form-example 

Введите в поле language значение Python , а в поле framework — значение Flask . Затем нажмите кнопку Submit.

Браузер должен вывести следующее сообщение:

Output
The language value is: Python The framework value is: Flask

Теперь вы понимаете, как обрабатывать данные формы. Перейдем к следующему типу входящих данных.

Использование данных JSON

Данные JSON обычно создаются процессом, который вызывает маршрут.

Пример объекта JSON:

 "language": "Python", "framework": "Flask", "website": "Scotch", "version_info":  "python": "3.9.0", "flask": "1.1.2" >, "examples": ["query", "form", "json"], "boolean_test": true > 

Такая структура позволяет передавать более сложные данные, чем строки запросов и данные форм. В этом примере вы видите вложенные объекты JSON и массив элементов. Этот формат данных может обрабатываться Flask.

Измените маршрут form-example в app.py , чтобы принимать запросы POST и игнорировать другие запросы, в частности GET:

@app.route('/json-example', methods=['POST']) def json_example(): return 'JSON Object Example' 

Для строк запросов и данных форм в этом учебном модуле мы использовали браузер, но для отправки объекта JSON мы используем Postman, чтобы отправлять персонализированные запросы в URL.

Примечание. Если вам нужна помощь в навигации по интерфейсу Postman для отправки запросов, воспользуйтесь официальной документацией.

Добавьте URL в Postman и измените тип на POST. На вкладке body переключитесь на raw и выберите JSON из раскрывающегося списка.

Эти настройки необходимы, чтобы Postman мог правильно отправлять данные JSON и чтобы ваше приложение Flask понимало, что получает данные JSON:

POST http://127.0.0.1:5000/json-example Body raw JSON 

Затем скопируйте в поле ввода текста предыдущий пример JSON.

Отправьте запрос. Вы должны получить ответ «JSON Object Example» . Это не так интересно, но это ожидаемо, потому что код для обработки ответа данных JSON еще нужно написать.

Чтобы читать данные, вам нужно понимать, как Flask преобразует данные JSON в структуры данных Python:

  • Все объекты конвертируются в словари Python. в JSON соответствуют somedict[‘key’] , который возвращает значение в Python.
  • Массив в JSON конвертируется в список в Python. Поскольку синтаксис одинаковый, приведем список примеров: [1,2,3,4,5]
  • Значения в кавычках объекта JSON станут строками в Python.
  • Логические операторы true и false становятся True и False в Python.
  • Числа без кавычек становятся числами в Python.

Теперь давайте поработаем с кодом, чтобы считывать входящие данные JSON.

Вначале добавим все содержимое объекта JSON в переменную, используя request.get_json() .

request.get_json() конвертирует объект JSON в данные Python. Давайте назначим данные входящего запроса в переменные и выведем их, внеся следующие изменения в маршрут json-example :

# GET requests will be blocked @app.route('/json-example', methods=['POST']) def json_example(): request_data = request.get_json() language = request_data['language'] framework = request_data['framework'] # two keys are needed because of the nested object python_version = request_data['version_info']['python'] # an index is needed because of the array example = request_data['examples'][0] boolean_test = request_data['boolean_test'] return ''' The language value is: <> The framework value is: <> The Python version is: <> The item at index 0 in the example list is: <> The boolean value is: <>'''.format(language, framework, python_version, example, boolean_test) 

Обратите внимание на процедуру доступа к элементам, находящимся не на верхнем уровне. Поскольку мы вводим вложенный объект, используется [‘version’][‘python’] . А [‘examples’][0] используется для доступа к индексу 0 в массиве example.

Если объект JSON, отправленный с запросом, не имеет ключа, доступ к которому осуществляется через функцию view, запрос не будет выполняться. Если вы не хотите, чтобы запрос выдавал сбой при отсутствии ключа, вам нужно будет проверить наличие ключа, прежде чем пытаться получить к нему доступ.

# GET requests will be blocked @app.route('/json-example', methods=['POST']) def json_example(): request_data = request.get_json() language = None framework = None python_version = None example = None boolean_test = None if request_data: if 'language' in request_data: language = request_data['language'] if 'framework' in request_data: framework = request_data['framework'] if 'version_info' in request_data: if 'python' in request_data['version_info']: python_version = request_data['version_info']['python'] if 'examples' in request_data: if (type(request_data['examples']) == list) and (len(request_data['examples']) > 0): example = request_data['examples'][0] if 'boolean_test' in request_data: boolean_test = request_data['boolean_test'] return ''' The language value is: <> The framework value is: <> The Python version is: <> The item at index 0 in the example list is: <> The boolean value is: <>'''.format(language, framework, python_version, example, boolean_test) 

Запустите приложение и отправьте пример запроса JSON с помощью Postman. В ответе вы увидите следующее:

Output
The language value is: Python The framework value is: Flask The Python version is: 3.9 The item at index 0 in the example list is: query The boolean value is: false

Теперь вы должны понимать принципы обработки объектов JSON.

Заключение

В этом учебном модуле мы создали приложение Flask с тремя маршрутами, которое будет принимать строки запросов, данные форм и объекты JSON.

Также не забывайте, что все подходы должны учитывать постоянную возможность ошибки при отсутствии ключа.

Предупреждение. В этом учебном модуле мы не рассмотрели вопрос санитарной обработки пользовательского ввода. Санитарная обработка пользовательского ввода делает так, чтобы приложение не могло неожиданно прекращать работу или обходить меры безопасности.

Если вы хотите узнать больше о Flask, на нашей странице тем по Flask вы найдете полезные упражнения и проекты по программированию.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *