Перейти к содержимому

Как получить данные с формы flask

  • автор:

Как во Flask в WTForms передать данные формы на другую страницу?

Долго уже вожусь с этим и не могу решить. Надо чтобы при успешном заполнении формы данные из нее отображались на другой странице. К примеру, форма находится на странице /form/ , а данные из нее должны отображаться на странице /form-success/ . Подскажите решение.

Сейчас остановился на этом. Результаты формы отображаются на этой же странице.

. class MyForm(FlaskForm): name = StringField('Ваше имя', [Length(min=3, max=10, message='Укажите имя')]) submit = SubmitField('Отправить') @app.route('/form/', methods=['GET', 'POST']) def render_form(): form = MyForm() if form.validate_on_submit(): output = render_template('form-success.html', form=form) return output else: output = render_template('form.html', form=form) return output . 
  • Вопрос задан более двух лет назад
  • 144 просмотра

2 комментария

Простой 2 комментария

Как получить данные из input и перенести их в код Flask?

Мне нужно получить данные из поля input в HTML в код Flask для дальнейшей работы с ними. Я подключил модуль request , но получить данные все равно не удается. На странице ошибка 400 Bad Request . Можно ли ее как-то решить? HTML-код:

    >" /> Регистрация  

Регистрация

@app.route('/reg', methods=['POST', 'GET']) def reg(): return render_template("reg.html") @app.route('/reg_run', methods=['POST', 'GET']) def reg_run(): a = request.form['name'] print(a) return a 

Отслеживать
задан 24 апр 2021 в 10:08
Nikita2431 Nikita2431
35 7 7 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Скажите, пожалуйста, это вот так вы хотите отправить форму?

 Подтяните, пожалуйста, основы HTML. Это просто ссылка, которая генерирует GET-запрос по указанному URL. Ну а результат предсказуемый, в обработчик не присылается вообще ничего, он падает с ошибкой и возвращает код 400.

Должно сработать вот так:

В этом случае действительно будет отправляться POST-запрос с телом, в котором будут поля формы, которые потом можно будет получить и обработать.

И не забывайте закрывать тэги, косая черта обязательно нужна, даже если и без нее как бы работает.

Получение данных из запроса в приложении на Flask

В материале рассматривается работа с контекстом запроса в приложении на Flask и доступ к различным данным запроса, а именно доступ к полям формы, дополнительным параметрам URL-адреса, получение данных JSON, извлечения информации о User-Agent и IP-адреса клиента, получение referrer-URL и так далее.

Содержание:

  • Доступ к параметрам, передаваемых в URL GET запросом.
  • Доступ к данным формы, передаваемой POST запросом.
  • Получение текущего URL-адреса страницы.
  • Информация об окружении WSGI сервера.
  • Получение данных в формате JSON.
  • Другие полезные атрибуты объекта запроса:
    • Заголовки, полученные вместе с запросом.
    • Файлы cookie , переданных вместе с запросом.
    • Реферальный URL-адрес.
    • Сведения о пользовательском агенте.

    Доступ к параметрам, передаваемых в URL GET запросом.

    Параметры GET запроса, передаются в качестве параметров URL-адреса. Это та часть URL- адреса, которая расположена после знака вопроса, например http://example.ru/search?query=str.lower&opt=9 , параметрами запроса будут считаться query=str.lower&opt=9 . Такие адреса в основном используются в поисковых запросах, REST API сайта или в AJAX-запросах.

    Для получения этих параметров необходимо воспользоваться свойством args входящего запроса flask.Request . По умолчанию, свойство request.args , представляет собой объект словаря, доступ к значениям параметров осуществляется по ключу request.args[‘opt’] Для безопасного извлечения ключей из словаря, что бы избежать исключений (при отсутствии ключа), можно воспользоваться методом dict.get() . Во Flask, синтаксис этого метода выглядит следующим образом:

    request.args.get(key, default=None, type=None) 

    Где аргумент key — это ключ (имя параметра в URL); default — возвращаемое значение, если ключа key не существует. Пример извлечения параметров GET-запроса, если URL-адрес имеет вид http://example.ru/search?query=str.lower&opt=9 :

    from flask import request @app.route('/search/', methods=['GET']) def search(): error = None query = request.args.get('query') # проверяем, передается ли параметр # 'query' в URL-адресе if query and query != '': # если `query`существует и это не пустая строка, # то можно приступать к обработке запроса opt = request.args.get('opt', default=0, type=int) # возвратит `query=str.lower, opt=9` return f"query=query>, opt=opt>" else: # если `query` не существует или это пустая строка, то # отображаем форму поискового запроса с сообщением. error = 'Не введен запрос!' return render_template('search.html', error=error) 

    Если важно сохранение порядка передаваемых параметров, то можно изменить тип данных, присвоив request.parameter_storage_class другой тип, например werkzeug.datastructures.ImmutableList .

    Доступ к данным формы, передаваемой POST запросом.

    Для доступа к данным формы (передаваемым в запросах POST или PUT ) нужно использовать атрибут входящего запроса request.form , который так же представляет собой словароподобный объект. Ключи request.form имеют значения атрибута name HTML-тэга в форме (например ).

    Так как request.form представляет собой словароподобный объект, то к нему рекомендуется обращаться с помощью метода словаря dict.get() или путем перехвата KeyError и выдачи собственной страницы с ошибкой HTTP 404 Not Found .

    В примере, для извлечения полей формы, воспользуемся методом request.args.get(key, default=None, type=None) . Предположим, что была передана форма авторизации пользователя на сайте:

    from flask import request @app.route('/login', methods=['POST', 'GET']) def login(): error = None if request.method == 'POST': if valid_login(request.form.get('username'), request.form.get('password')): # если условие if выполнилось успешно, то 'username' # существует и дальше к нему можно обращаться как # к ключу словаря, что на много быстрее. return log_the_user_in(request.form['username']) else: error = 'Неверное имя пользователя или пароль' return render_template('login.html', error=error) 

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

    Примечание: объект запроса flask.Request еще содержит атрибут request.values , который объединяет в себе значения, передаваемые GET и POST запросами. Другими словами, используя request.values.get() можно получить доступ как к элементам передаваемой формы в HTML-полях , так и параметрам, передаваемым в URL-адресе.

    Обратите внимание, что атрибут объекта запроса request.method содержит в себе строковое значение HTTP-метода.

    Получение текущего URL-адреса страницы.

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

    Объект запроса flask.Request позволяет это сделать. За URL-адрес в объекте запроса отвечают несколько атрибутов:

    • request.url — полный URL-адрес запроса со схемой request.scheme , хостом request.host_url , корневым путем request.root_path , путем request.path и строкой запроса request.query_string .
    • request.base_url — как request.url , но без строки запроса.
    • request.url_root — URL-адрес со схемой request.scheme , хостом request.host_url , корневым путем request.root_path .
    • request.scheme — схема URL-адресов ( http или https ).
    • request.host — только хост, включая порт, если он доступен.
    • request.root_path — префикс, под которым монтируется приложение, без завершающей косой черты (еще известен как environ[«SCRIPT_ROOT»] ).
    • request.path — часть пути URL-адреса после root_path . Это путь, используемый для маршрутизации внутри приложения.
    • request.full_path — запрошенный путь URL, включая строку запроса (параметры URL, после знака вопроса).
    • request.query_string — часть URL-адреса после знака вопроса ‘?’ .
    • request.url_charset — кодировка, которая предполагается для URL-адресов.

    Разберем значение приведенных выше атрибутов объекта запроса на примере. Допустим, что приложение имеет следующий корень: http://www.example.com/myapp и пользователь запрашивает следующий URI-адрес: http://www.example.com/myapp/%CF%80/page.html?x=y

    В этом случае значения вышеупомянутых атрибутов будут следующими:

    • request.url : ‘http://www.example.com/myapp/π/page.html?x=y’ ;
    • request.base_url : ‘http://www.example.com/myapp/π/page.html’ ;
    • request.url_root : ‘http://www.example.com/myapp/’
    • request.scheme : ‘http’ ;
    • request.host : ‘www.example.com’ ;
    • request.root_path : ‘/myapp’ ;
    • request.path : ‘/π/page.html’ ;
    • request.full_path : ‘/π/page.html?x=y’ ;
    • request.query_string : x=y.

    Информация об окружении WSGI сервера.

    Если запуск и работоспособность приложение Flask обеспечивается WSGI сервером (например gunicorn ), то информацию об окружении этого сервера можно получить из атрибута объекта запроса request.environ . Этот атрибут представляет собой словарный объект и содержит информацию об окружении WSGI, а так же HTTP-заголовки, полученные вместе с запросом.

    Переменные окружения WSGI сервера.

    Из словарного атрибута запроса request.environ можно узнать очень много интересного, например реферальный URL-адрес (это адрес, с которого клиент перешел на текущий URL), его ключ в окружении ‘HTTP_REFERER’ . Возвращаемые ключи словарного объекта request.environ во многом зависят от того где работает и как настроен WSGI сервер, т.е. здесь все индивидуально.

    Вот некоторые из них:

    ‘wsgi.version’, ‘PATH_INFO’ ‘HTTP_SEC_CH_UA’
    ‘wsgi.url_scheme’ ‘QUERY_STRING’ ‘HTTP_SEC_CH_UA_MOBILE’
    ‘wsgi.input’ ‘REQUEST_URI’ ‘HTTP_SEC_CH_UA_PLATFORM’
    ‘wsgi.errors’ ‘RAW_URI’ ‘HTTP_UPGRADE_INSECURE_REQUESTS’
    ‘wsgi.multithread’ ‘REMOTE_ADDR’ ‘HTTP_DNT’
    ‘wsgi.multiprocess’ ‘REMOTE_PORT’ ‘HTTP_USER_AGENT’
    ‘wsgi.run_once’ ‘SERVER_NAME’ ‘HTTP_ACCEPT’
    ‘werkzeug.socket’ ‘SERVER_PORT’ ‘HTTP_REFERER’
    ‘SERVER_SOFTWARE’ ‘SERVER_PROTOCOL’ ‘HTTP_ACCEPT_ENCODING’
    ‘REQUEST_METHOD’ ‘HTTP_HOST’ ‘HTTP_ACCEPT_LANGUAGE’
    ‘SCRIPT_NAME’ ‘HTTP_CONNECTION’ ‘HTTP_COOKIE’

    Только не забывайте при обращении к словарному атрибуту request.environ , применять метод dict.get() , что бы избежать появления исключения, если какой-то ключ отсутствует.

    Реальный IP-адрес клиента.

    Переменные WSGI сервера необходимы, например, что бы узнать реальный IP-адрес посетителя сайта, если приложение Flask работает за прокси сервером, таким как Nginx. В ситуации с прокси, атрибут запроса request.remote_addr будет возвращать IP-адрес самого прокси сервера (т. е. локальный IP-адрес, на котором он работает, например 127.0.0.1), а не клиента. Реальный IP-адрес клиента можно узнать из окружения WSGI, обратившись к ключу ‘HTTP_X_FORWARDED_FOR’ или ‘X-Real-IP’ , это зависит, какая переменная использовалась при настройке Nginx:

    # если `HTTP_X_FORWARDED_FOR` не определен, # то просто возвращаем `request.remote_addr` request.environ.get('HTTP_X_FORWARDED_FOR', request.remote_addr) 

    Примечание. Заголовок X-Forwarded-For (XFF) является де-факто стандартным заголовком для идентификации происхождения IP-адреса клиента, подключающегося к веб-серверу через HTTP-прокси или балансировщик нагрузки. Когда трафик перехватывается между клиентом и сервером, то журналы доступа к серверу содержат только IP-адрес прокси-сервера или балансировки нагрузки.

    И вообще, при связке: прокси сервер -> WSGI сервер -> приложение Flask, максимум информации лучше брать из окружения request.environ , т.к. здесь она будет более правдива.

    Получение данных в формате JSON.

    Что бы извлечь JSON данные, передаваемые в запросе необходимо воспользоваться методом объекта запроса .get_json() , который имеет следующий синтаксис:

    data = request.get_json(force=False, silent=False, cache=True) 
    • force : ( bool ) — игнорирует тип mimetype и всегда пытается анализировать JSON.
    • silent : ( bool ) — отключает появление возможных ошибок при анализе JSON и если они происходят то возвращает None .
    • cache : ( bool ) — сохраняет проанализированный JSON для последующих вызовов.

    Если заголовок mimetype не указывает на JSON данные ( application/json ), то этот метод, по умолчанию ( force=False ), возвратит None .

    Если синтаксический анализ JSON завершается неудачно, то вызывается функция request.on_json_loading_failed() , и в качестве возвращаемого значения используется ее значение.

    Другие полезные атрибуты объекта запроса.

    request.headers :

    Атрибут объекта запроса request.headers содержит все заголовки, полученные вместе с запросом. Представляет собой словарный объект, следовательно, для безопасного получения заголовка можно воспользоваться методом словаря dict.get() :

    request.headers.get('HEADER-NAME') 

    Если заголовок с именем ‘HEADER-NAME’ не существует то код выше вернет None (исключения не будет), поэтому его можно использовать в конструкции:

    if request.headers.get('HEADER-NAME'): . 

    Но прямое обращение к ключу приведет к появлению исключения KeyError: ‘HEADER-NAME’

    if request.headers['HEADER-NAME']: . 

    Если необходимо обращаться к request.headers без использования метода dict.get() , то используйте следующую конструкцию:

    if 'HEADER-NAME' in request.headers: customHeader = request.headers['HEADER-NAME'] . 
    request.cookies :

    Атрибут объекта запроса request.cookies содержит все файлы cookie , переданных вместе с запросом. Представляет собой словарный объект.

    cookie = request.cookies.get('cookie-name'): 

    Методику работы с объектом request.cookies смотрите на примере request.headers

    request.referrer :

    Атрибут объекта запроса request.referrer содержит поле заголовка запроса, которое позволяет клиенту указать, в интересах сервера, адрес ресурса, с которого клиент перешел на текущий URL.

    referrer = request.referrer # что эквивалентно получению заголовка referrer = request.headers.get('Referer') 
    request.user_agent :

    Атрибут объекта запроса request.user_agent представляет собой данные заголовка, содержащие сведения о пользовательском агенте.

    Чтобы получить значение заголовка, необходимо использовать выражение: request.user_agent.string .

    agent_string = request.user_agent.string # что эквивалентно получению заголовка request.headers.get('User-Agent') 
    • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
    • Пример структуры приложения Flask как пакета Python
    • Модульные приложения на схемах blueprint во Flask Python
    • Фабрика веб-приложений модуля Flask
    • Представления в веб-приложении на Flask Python
    • Правила составления URL-маршрутов во Flask Python
    • Использование шаблонизатора Jinja2 в приложении Flask Python
    • Пользовательские страницы HTTP-ошибок на Flask Python
    • Выполнение кода до или после запроса во Flask Python
    • Загрузка файлов на сервер во Flask Python
    • Всплывающие сообщения в приложении на Flask Python
    • Извлечение данных из запроса во Flask Python
    • Хранение и загрузка конфигураций Flask
    • Параметры/ключи конфигурации, используемые во Flask
    • Папки экземпляров приложений на Flask
    • Контекст веб-приложения на Flask
    • Контекст запроса приложения на Flask
    • Ведение журнала логов в приложении Flask Python
    • Собственные декораторы в приложении Flask Python
    • Класс Config() модуля flask
    • Функция redirect модуля flask
    • Функция url_for() модуля flask
    • Прокси-объект current_app() модуля flask
    • Функция abort() модуля flask
    • Отладочные сигналы приложения Flask
    • Работа с cookie в приложении на Flask Python
    • Безопасность веб-приложения на Flask
    • Асинхронность в веб-приложении на Flask
    • Использование URL-процессора в приложениях на Flask Python
    • Диспетчеризация приложений на Flask
    • Функция make_response модуля flask
    • Доступность контекстов запроса/приложения во Flask Python
    • Декоратор @route() и метод add_url_rule() приложения Flask Python
    • Функция send_file() модуля flask
    • Функция send_from_directory() модуля flask
    • Как обслуживать статические файлы в Flask Python
    • Функция render_template() модуля flask
    • Класс Markup() модуля flask
    • Отложенная загрузка представлений в приложении Flask Python
    • Сессии/сеансы sessions модуля flask
    • Глобальный объект flask.g в приложении Flask Python
    • Класс Request() модуля flask
    • Класс Response() модуля flask
    • Класс Flask() модуля flask
    • Тестирование приложений на Flask
    • Использование SQLite 3 в приложении Flask Python
    • Генерация своей капчи на сайте Flask
    • Использование модуля WTForms в приложении Flask Python
    • Расширение Flask-Caching для приложения Flask
    • Расширение Flask-Assets, управление статикой приложения
    • Расширение Flask-WTF для приложения Flask
    • Расширение Flask-SQLAlchemy для приложения Flask
    • Расширение Flask-Paginate для приложения Flask
    • Расширение Flask-Mail для приложения Flask
    • Расширение Flask-APScheduler
    • Связка Nginx + Gunicorn + Gevent + Flask Python
    • Как передать переменную NGINX во Flask environ
    • Защита приложения/сайта от DDoS атак

    Как обработать данные из формы с помощью Python (flask)?

    Есть хтмл с формой и script.py. Фреймворк Flask.
    Как передать данные из input в функцию в качестве аргумента?
    И как вывести распарсеные скриптом данные обратно в хтмл?

    • Вопрос задан более трёх лет назад
    • 4983 просмотра

    Комментировать

    Решения вопроса 1

    ivanesi @ivanesi Автор вопроса

    на первую половину вопроса ответ нашел тут: stackoverflow.com/questions/12277933/send-data-fro.

    Ответ написан более трёх лет назад

    Комментировать

    Нравится Комментировать

    Ответы на вопрос 1

    varagian

    Передать в функцию можно так (код одной из функций www.habr-analytics.com/user )

    @app.route('/userfig//') def userfig(name,datatype): name = str(name.strip().lower()) # unsupported operation if datatype not in datatypes: return . 

    Передать назад в форму можно следующим образом (оттуда же)

    @app.route('/user/', methods=['GET']) def user(): name = request.args.get('name') datatype = request.args.get('datatype') data_title = None if datatype in datatypes: data_title = datatypes_to_title[datatype] return render_template("user.html", usernameform=usernameform, name=name, datatype=datatype, datatypes=datatypes, data_title = data_title)

    Ответ написан более трёх лет назад

    Значит после передачи данных они обработаются внутри фласка, а затем фласк вернет новый шаблон и страница перезагрузится?
    Как можно было бы здесь использовать AJAX для возврата обработанной информации на форму?

    Ваш ответ на вопрос

    Войдите, чтобы написать ответ

    ubuntu

    • Ubuntu
    • +1 ещё

    Почему при установке flask в ubuntu в браузере отображается «Не удается подкл к сайту»?

    • 1 подписчик
    • вчера
    • 62 просмотра

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

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