Найти - Пользователи
Полная версия: Flask redirect на предыдущую страницу при условиях
Начало » Python для новичков » Flask redirect на предыдущую страницу при условиях
1 2
demonworm
Здравствуйте.

Допустим, есть несколько страниц (пусть будет А, Б, В), которые имеют ссылку на одну и ту же страницу (Г). При этом А это статичная страница без форм, Б это страница с формами, В это одна из страниц pagination, полученная в результате отправки данных через формы страницы Б.

Каким образом так организовать redirect, чтобы со страницы Г, в которой тоже заполняются и отправляются формы, после отправки этих форм вернуться на предыдущую страницу (А, Б или В), при этом вернулось бы в случае со страницой В pagination в том же месте (на той же странице), с которой был осуществлен переход на страницу Г?

Прошу помочь просто с логикой flask. С деталями разберусь.

Из опробованного:

1. request.referrer отдает страницу Г перед отправкой формы.
2. request.url отдает предыдущую страницу (в случае страницы А или даже Б нормально, но со страницей В такое не подходит).

Какие есть best practices? Пока надумал теоритически создать в БД таблицу, куда забивать все данные о странице, с которой идет переход на страницу Г, а потом при отправке форм со страницы Г забирать из БД данные и рендерить шаблон на их основе. С деталями пока не разбирался. Неудобство вижу в том, что на странице Б у меня с десяток форм, при этом не все обязательные. Надо будет как-то подгонять в БД, какие колонки заполнять и как определять, из каких что брать. В правильном направлении думаю? Встроенного во flask решения не увидел в документации.
demonworm
Да, еще одно уточнение. Был вариант с прокидыванием request.referrer со страницы В после того, как была осуществлена отправка форм поиска на странице Б, но т. к. я почти не использую get, везде post, я в referrer на странице В получаю страницу Б, то есть в ссылке нет поисковых параметров.
py.user.next
Попробуй сессию сделать
https://flask-docs.readthedocs.io/en/latest/api/#sessions
A session makes it possible to remember information from one request to another.
Пример, как через сессию передать данные из формы от запроса к запросу
https://testdriven.io/blog/flask-sessions/
demonworm
Спасибо за вариант. Я уже успел реализовать через БД, как описывал, но через сессии проще и, наверное, правильнее.

На следующем этапе - редиректе на страницу В, то есть на страницу Б с заранее заданными данными для форм + отправкой, возникла проблема. При использовании сессии, ровно как при использовании моего неудачного варианта с переносом ссылки через БД, запрос оформляется через GET. Таким образом, форма сама никуда не отправляется. Я просто получаю пустую форму на странице Б и параметры поиска в ссылке на эту страницу. Почитав документацию по redirect, я не нашел, каким образом можно передать метод вместе с редиректом. Получается, что оба способа к нужному результату не приводят…

Через render_template я тоже пробовал, но ввиду архитектуры моего приложения, у меня модуль поиска отдельно от основного модуля (все через blueprint). Поэтому рендерить шаблон страницы В из главного модуля, откуда я должен перенаправить пользователя обратно, невозможно.

Как мне с наименьшими потерями выйти из ситуации?
demonworm
Кажется, разобрался. Пришлось в маршрут поиска внедрить в самом начале проверку на предмет наличия данных сессии (сделал флаг
  session['go_back'] = True
, когда надо обрабатывать поиск именно через GET). Удобно, что не надо при редиректе каждый раз отправлять все параметры для повтороного поиска, т.к. session автоматически переносится между маршрутами. Очистку сессии тоже добавил сразу же после первого срабатывания условия, про которое писал выше. Осталось добработать детали, вроде перехода на другие страницы при отработке условия по поиску.
ZerG
Какаято у вас однако странная структура приложения….
py.user.next
demonworm
Как мне с наименьшими потерями выйти из ситуации?
Объект сессии в Flask защищён от всякой фигни. Поэтому его можно заполнять чем угодно. На каждом переходе (перед переходом, после перехода) ты туда информацию кладёшь и потом в странице проверяешь, какая информация там есть. Если там информация о форме есть, то её не нужно ждать от пользователя, а достаточно заполнить её автоматически, взяв нужные параметры формы и всего остального из объекта. Если же там информации нет, то надо ждать ввода от пользователя. При этом перед переходом по форме можно объект сессии подправить и что-то туда добавить.
py.user.next
ZerG
Какаято у вас однако странная структура приложения….
Хрен его знает; может, у него JavaScript запрещён. Обычно это всё через него делается.

Я, например, формы никогда HTML-у не отдаю. Хрен его знает, как там каждый конкретный браузер её обрабатывает. Зато JavaScript отлично с формами работает, все проверки там делает и так далее, ждёт всяких событий, контролирует поля, кнопки и тому подобное, причём кнопки можно рисовать прямо в любом виде и с любым поведением. Так его ещё и обфусцировать можно, чтобы там не копались.
demonworm
Вы все верно предположили. Только не запрещен, а я его не знаю Я изучаю python, чтобы написать для себя и знакомых пару простых приложений для облегчения жизни и работы. Ознакомившись с инструментарием для написания, понял, что проще будет сделать это через web, а не через нативные gui (чтобы кроссплатформенно было без заморочек + браузер в любом случае уже у всех запущен), хотя по сути у меня локальное однопользовательское приложение. Всё приложение у меня на python и кроме стандартной библиотеки подключен flask и flask-wtforms.

Не уверен, будет ли целесообразно для меня изучать еще javascript для этих целей. В приципе у меня приложение уже готово, остается доделать такие вот “приятности” вроде возврата на предыдущую страницу и более удобный pagination (сейчас у меня он в виде
 [1][Назад][Вперед][последняя страница]
).
py.user.next
demonworm
Не уверен, будет ли целесообразно для меня изучать еще javascript для этих целей. В приципе у меня приложение уже готово, остается доделать такие вот “приятности” вроде возврата на предыдущую страницу и более удобный pagination (сейчас у меня он в виде
[1][Назад][Вперед][последняя страница]
).
Если делаешь web-приложения, то JavaScript необходим просто. HTML слишком древний, поэтому те же формы в нём практически ничего не могут делать, так как тогда, когда HTML создавался, только за счастье было сделать саму форму. Времена были другие, протокол HTTP был молодой тогда, поэтому все эти элементы вроде форм такие топорные, неразвитые и негибкие. С JavaScript я вот делал “форму”, так там вообще даже формы не было HTML-шной, я просто рисовал кнопки, делал поля ввода, потом прикреплял нажатия на “кнопки” к “полям ввода” через события, и это всё работало как форма. Зато не висло ничего, не нужно было обновлять страницу и отправлялось всё из “формы” в несколько ботов сразу в нескольких мессенджерах. Так что кто мне что отправил через эту “форму”, я сразу же получал в Slack, Telegram и на электронную почту, потому что оно размножалось таким образом, чтобы при отказе какого-то из мессенджеров я не пропустил отправленное через “форму” сообщение. В то же время отправляющий человек видел, что всё отправилось успешно через “форму”, потому что JavaScript-скрипт анализировал ответы от ботов, прошла ли отправка в бот в мессенджере или нет, прошла ли отправка на электронную почту или нет, и писал ему тут же возле “формы” результат типа “ваше сообщение отправилось” или наоборот “сообщение не прошло, повторите отправку”. Никакой HTML этого всего не даст сделать.

Так что вся живость сайта или web-приложения лежит на JavaScript.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB