Форум сайта python.su
Здравствуйте.
Допустим, есть несколько страниц (пусть будет А, Б, В), которые имеют ссылку на одну и ту же страницу (Г). При этом А это статичная страница без форм, Б это страница с формами, В это одна из страниц pagination, полученная в результате отправки данных через формы страницы Б.
Каким образом так организовать redirect, чтобы со страницы Г, в которой тоже заполняются и отправляются формы, после отправки этих форм вернуться на предыдущую страницу (А, Б или В), при этом вернулось бы в случае со страницой В pagination в том же месте (на той же странице), с которой был осуществлен переход на страницу Г?
Прошу помочь просто с логикой flask. С деталями разберусь.
Из опробованного:
1. request.referrer отдает страницу Г перед отправкой формы.
2. request.url отдает предыдущую страницу (в случае страницы А или даже Б нормально, но со страницей В такое не подходит).
Какие есть best practices? Пока надумал теоритически создать в БД таблицу, куда забивать все данные о странице, с которой идет переход на страницу Г, а потом при отправке форм со страницы Г забирать из БД данные и рендерить шаблон на их основе. С деталями пока не разбирался. Неудобство вижу в том, что на странице Б у меня с десяток форм, при этом не все обязательные. Надо будет как-то подгонять в БД, какие колонки заполнять и как определять, из каких что брать. В правильном направлении думаю? Встроенного во flask решения не увидел в документации.
Отредактировано demonworm (Ноя. 1, 2023 14:13:52)
Офлайн
Да, еще одно уточнение. Был вариант с прокидыванием request.referrer со страницы В после того, как была осуществлена отправка форм поиска на странице Б, но т. к. я почти не использую get, везде post, я в referrer на странице В получаю страницу Б, то есть в ссылке нет поисковых параметров.
Офлайн
Попробуй сессию сделать
https://flask-docs.readthedocs.io/en/latest/api/#sessions
A session makes it possible to remember information from one request to another.Пример, как через сессию передать данные из формы от запроса к запросу
Офлайн
Спасибо за вариант. Я уже успел реализовать через БД, как описывал, но через сессии проще и, наверное, правильнее.
На следующем этапе - редиректе на страницу В, то есть на страницу Б с заранее заданными данными для форм + отправкой, возникла проблема. При использовании сессии, ровно как при использовании моего неудачного варианта с переносом ссылки через БД, запрос оформляется через GET. Таким образом, форма сама никуда не отправляется. Я просто получаю пустую форму на странице Б и параметры поиска в ссылке на эту страницу. Почитав документацию по redirect, я не нашел, каким образом можно передать метод вместе с редиректом. Получается, что оба способа к нужному результату не приводят…
Через render_template я тоже пробовал, но ввиду архитектуры моего приложения, у меня модуль поиска отдельно от основного модуля (все через blueprint). Поэтому рендерить шаблон страницы В из главного модуля, откуда я должен перенаправить пользователя обратно, невозможно.
Как мне с наименьшими потерями выйти из ситуации?
Отредактировано demonworm (Ноя. 3, 2023 08:24:39)
Офлайн
Кажется, разобрался. Пришлось в маршрут поиска внедрить в самом начале проверку на предмет наличия данных сессии (сделал флаг
session['go_back'] = True
Офлайн
Какаято у вас однако странная структура приложения….
Офлайн
demonwormОбъект сессии в Flask защищён от всякой фигни. Поэтому его можно заполнять чем угодно. На каждом переходе (перед переходом, после перехода) ты туда информацию кладёшь и потом в странице проверяешь, какая информация там есть. Если там информация о форме есть, то её не нужно ждать от пользователя, а достаточно заполнить её автоматически, взяв нужные параметры формы и всего остального из объекта. Если же там информации нет, то надо ждать ввода от пользователя. При этом перед переходом по форме можно объект сессии подправить и что-то туда добавить.
Как мне с наименьшими потерями выйти из ситуации?
Отредактировано py.user.next (Ноя. 4, 2023 04:11:41)
Офлайн
ZerGХрен его знает; может, у него JavaScript запрещён. Обычно это всё через него делается.
Какаято у вас однако странная структура приложения….
Отредактировано py.user.next (Ноя. 4, 2023 04:15:22)
Офлайн
Вы все верно предположили. Только не запрещен, а я его не знаю Я изучаю python, чтобы написать для себя и знакомых пару простых приложений для облегчения жизни и работы. Ознакомившись с инструментарием для написания, понял, что проще будет сделать это через web, а не через нативные gui (чтобы кроссплатформенно было без заморочек + браузер в любом случае уже у всех запущен), хотя по сути у меня локальное однопользовательское приложение. Всё приложение у меня на python и кроме стандартной библиотеки подключен flask и flask-wtforms.
Не уверен, будет ли целесообразно для меня изучать еще javascript для этих целей. В приципе у меня приложение уже готово, остается доделать такие вот “приятности” вроде возврата на предыдущую страницу и более удобный pagination (сейчас у меня он в виде
[1][Назад][Вперед][последняя страница]
Офлайн
demonwormЕсли делаешь web-приложения, то JavaScript необходим просто. HTML слишком древний, поэтому те же формы в нём практически ничего не могут делать, так как тогда, когда HTML создавался, только за счастье было сделать саму форму. Времена были другие, протокол HTTP был молодой тогда, поэтому все эти элементы вроде форм такие топорные, неразвитые и негибкие. С JavaScript я вот делал “форму”, так там вообще даже формы не было HTML-шной, я просто рисовал кнопки, делал поля ввода, потом прикреплял нажатия на “кнопки” к “полям ввода” через события, и это всё работало как форма. Зато не висло ничего, не нужно было обновлять страницу и отправлялось всё из “формы” в несколько ботов сразу в нескольких мессенджерах. Так что кто мне что отправил через эту “форму”, я сразу же получал в Slack, Telegram и на электронную почту, потому что оно размножалось таким образом, чтобы при отказе какого-то из мессенджеров я не пропустил отправленное через “форму” сообщение. В то же время отправляющий человек видел, что всё отправилось успешно через “форму”, потому что JavaScript-скрипт анализировал ответы от ботов, прошла ли отправка в бот в мессенджере или нет, прошла ли отправка на электронную почту или нет, и писал ему тут же возле “формы” результат типа “ваше сообщение отправилось” или наоборот “сообщение не прошло, повторите отправку”. Никакой HTML этого всего не даст сделать.
Не уверен, будет ли целесообразно для меня изучать еще javascript для этих целей. В приципе у меня приложение уже готово, остается доделать такие вот “приятности” вроде возврата на предыдущую страницу и более удобный pagination (сейчас у меня он в виде
).[1][Назад][Вперед][последняя страница]
Отредактировано py.user.next (Ноя. 4, 2023 09:54:10)
Офлайн