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

Помогите найти причину проблемы. С решением попробую разобраться сам.

У меня приложение на flask с самописным разделением на страницы и без ORM. Пример маршрута:

 @bp.route("/search", methods=["GET", "POST"])
@login_required
def search_document():
    """
    Search document.
    """
    # Get current page.
    page = request.args.get("page", default=1, type=int)
    # For completion on page get all part_ids.
    partners_datalist = [s[0] for s in search.get_unique_partners()]
    # Form and choices.
    form = SearchDocument()
    form.org_id.choices = [(o[0], o[1]) for o in search.get_orgs()]
    if form.is_submitted():
        matches = search.get_num_matches(
            form.search_name.data,
            form.start_date.data,
            form.end_date.data,
            form.storage_until.data,
            form.org_id.data,
            form.part_name.data,
            form.type_id.data,
            form.comment.data
        )
        limit = 10
        offset = (page - 1) * limit if page > 1 else 0
        # Always round to upper.
        pages = matches // limit + (matches % limit > 0)
        # Get next/previous page number and link based on current
        # page, matches and per page limit.
        prev_url = (url_for("search.search_document", page=page - 1) if page > 1
                    else None)
        next_url = (url_for("search.search_document", page=page + 1,
                            search_name=form.search_name.data,
                            start_date=form.start_date.data,
                            end_date=form.end_date.data,
                            storage_until=form.storage_until.data,
                            org_id=form.org_id.data,
                            part_name=form.part_name.data,
                            type_id=form.type_id.data,
                            comment=form.comment.data) if page < pages
                    else None)
        page_minus_two_url = (url_for("search.search_document", page=page - 2) if page > 3
                              else None)
        page_plus_two_url = (url_for("search.search_document", page=page + 2) if page < pages - 1
                             else None)
        first_page_url = (url_for("search.search_document", page=1) if page > 2
                          else None)
        last_page_url = (url_for("search.search_document", page=pages) if pages > 2 and page < pages - 2
                         else None)
        # Actual results.
        found_docs = search.search_document(
            form.search_name.data,
            form.start_date.data,
            form.end_date.data,
            form.storage_until.data,
            form.org_id.data,
            form.part_name.data,
            form.type_id.data,
            form.comment.data,
            form.order_field.data,
            form.order_direction.data,
            limit,
            offset
        )
        return render_template("search_results.html",
                               results=found_docs,
                               search_name=form.search_name.data,
                               start_date=form.start_date.data,
                               end_date=form.end_date.data,
                               storage_until=form.storage_until.data,
                               org_id=form.org_id.data,
                               part_name=form.part_name.data,
                               type_id=form.type_id.data,
                               comment=form.comment.data,
                               order_field=form.order_field.data,
                               order_direction=form.order_direction.data,
                               prev_url=prev_url,
                               next_url=next_url,
                               page_plus_two_url=page_plus_two_url,
                               page_minus_two_url=page_minus_two_url,
                               first_page_url=first_page_url,
                               last_page_url=last_page_url,
                               matches=matches,
                               page=page,
                               pages=pages)
    return render_template("search.html", form=form,
                           partners_datalist=partners_datalist)

На странице результатов поиска есть различные действия с выведенными документами, например, удаление. Я хочу чтобы нажатие на кнопку удаления, которое обрабатывается через маршрут
@bp.route("/delete/<int:doc_id>", methods=["GET", "POST"])
...
return redirect(url.referrer)
по завершению процедуры удаления документа возвращало пользователя на ту же страницу поиска, на которой он был до нажатия на кнопку удаления. При использовании моего кода после отработки маршрута удаления происходит возврат к форме поиска по маршруту
@bp.route("/search", methods=["GET", "POST"])
, несмотря на использовании в маршруте удаления инструкции перенаправления на предыдущую страницу. Я подозреваю, что дело в том, что я из формы поиска при формировании результатов поиска в адресную строку не передаю параметры поиска и текущую страницу. Я правильно думаю?

P. S. Если возможно обойтись без JS, я хотел бы это сделать.
py.user.next
vbsm
возвращало пользователя на ту же страницу поиска, на которой он был до нажатия на кнопку удаления
Чтобы он десять раз мог удалять одно и то же уже удалённое?
vbsm
Если возможно обойтись без JS
Ну вообще, взаимодействовать с пользователем надо через JavaScript. А вот то, что оно там делает на самом деле, должно быть на сервере. Поэтому пользователь взаимодействует с JavaScript-скриптами, а они уже передают информацию серверной части с указаниями, что нужно сделать, и просходит это в фоновом режиме незаметно для пользователя.

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

Но вообще, должно быть так. Пользователь нажал кнопку удалить у пункта. Удаляемый пункт удаляется (скрывается), а заодно на API в фоновом режиме посылается сообщение “удалить то-то”. Пользователь видит, что оно удалилось. Если он обновит страницу, оно там тоже будет удалённым. При этом никаких перепоисков делать не надо.

vbsm
Я подозреваю, что дело в том, что я из формы поиска при формировании результатов поиска в адресную строку не передаю параметры поиска
Тебе надо эти параметры, с которыми ты искал, взять и заново искать с ними. То есть в странице с кнопками удаления у тебя должны быть эти параметры известны, а значит переданы изначально. Но даже если они у тебя будут передаваться, то тебе просто некуда их подавать, потому что на API у тебя нет поискового механизма, куда можно подать параметры, чтобы оно произвело поиск и вернуло найденные по этим параметрам данные. Где вот этот механизм? Нет его.

Если ты хочешь без JavaScript работать, то ты должен сначала тогда сделать всю эту инфраструктуру, которая позволит тебе без JavaScript все эти удобности делать.
michaelarrington
Да, ваша гипотеза, скорее всего, верна. Проблема заключается в том, что при возврате на предыдущую страницу (request.referrer) Flask перенаправляет на URL, который был записан в реферере браузера. PolyTrack
harryluu
Да, ваша теория, скорее всего, верна. Проблема в том, что Flask перенаправляет на URL, сохраненный в реферере браузера, когда вы возвращаетесь на предыдущую страницу.
io games
lorde
Да, вы правильно думаете. Проблема заключается в том, что при удалении документа вы выполняете редирект на url.referrer, но этот редирект не сохраняет параметры поиска и текущую страницу. В результате, после удаления документа вы попадаете на форму поиска без сохранённых параметров, Geometry Dash Lite что приводит к тому, что страница не отображает результаты поиска, а снова показывает форму.
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