Как удалить параметры из URL в Flask python


На моем сайте у меня есть URL-адреса, которые будут иметь конечные параметры, такие как:

example.com/magicpage/?p=10&d=somestuff

Есть ли способ удалить эти параметры после обработки запроса? Поэтому, когда пользователь нажимает на ссылку, параметры передаются, но видимый URL-адрес просто example.com/magicpage

Подробнее:

@app.route("/magicpage")
def magicPage():
    parse parameters and do things
    finish up
    remove the trailing parameters in the url
    return the rendered page
2 6

2 ответа:

Существует два способа сделать это.

Вариант 1: используйте параметры POST вместо GET.

Если параметры передаются HTML-формой, добавьте method=post в тег <form> и измените страницу с:

@app.route("/magicpage")
def magicPage():
    param1 = request.args.get("param1")
    param2 = request.args.get("param2")

Кому:

@app.route("/magicpage", methods=["POST"])
def magicPage():
    param1 = request.form.get("param1")
    param2 = request.form.get("param2")

Плюс в том, что нет перенаправления. Недостатком является то, что если пользователь попытается обновить полученную страницу, он получит неприятное всплывающее окно браузера о повторной отправке информации:

Подтверждение обновления Firefox веб-страницы сообщения

Тем не менее, это более распространенный способ иметь скрытые параметры, передаваемые в сети.


Вариант 2: Сделайте редирект после обработки параметров.

Это немного сложно, потому что, поскольку мы перенаправляем на одну и ту же страницу, нам нужно проверить, приходят ли они на эту страницу в первый раз или во второй.

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

@app.route("/magicpage", methods=["GET", "POST"])
def magicPage():
    if request.method == 'POST':
        # process parameters
        redirect(request.path)
    if request.method == "GET":
        # render page

В качестве альтернативы, вы можете просто проверить наличие одного из параметров в качестве индикатора:

@app.route("/magicpage", methods=["GET", "POST"])
def magicPage():
    if request.form.get("param1", None) is not None:
        # process parameters
        redirect(request.path)
    else:
        # render page

Вы можете использовать скрытые поля форм для передачи параметров по нескольким страницам с помощью POST.

<input type="hidden" ...>